快乐数
202. 快乐数 - 力扣(LeetCode)
图:
java
// 快乐数 --> 19 => 1^2 + 9 ^2 = 82 => 82 => 8 ^ 2 + 2 ^ 2 ......
public boolean isHappy(int n) {
// 使用快慢指针
int slow = n, fast = getSum(n);
while (slow != fast) {
slow = getSum(slow);
fast = getSum(getSum(fast));
}
return slow == 1;
}
// 返回 n 这个数每一位的平方和
public int getSum(int n) {
int sum = 0;
while (n != 0) {
// 获取导最后一位
int t = n % 10;
// 相当于 每个位子 n 平方
sum += t * t;
n /= 10;
}
return sum;
}
python:
class Solution(object):
def isHappy(self, n):
show = n
fast = self.getSum(n)
while show != fast:
show = self.getSum(show)
fast = self.getSum(self.getSum(fast))
return show == 1
# 获取 平方和
def getSum(self, n):
sum = 0
while n != 0:
t = n % 10
sum = t * t + sum
n = n / 10
return sum
这里还有一个取巧的方法,本体难点就是不是 快乐数的进行平方运算会出现循环的情况吗 ,那么我们使用一个 计数器 ,记录下每次平方的次数,然后规定一个值,只要计数器等于这个值后 ,就直接返回 false , 说明不是 快乐数
public boolean isHappy(int n) {
int count = 0;
int ret = 0;
while (true) {
int a = n % 10;
n /= 10;
// 相当于 平方操作
count += a * a;
if (n == 0) {
//此时说明是快乐数
if (count == 1) {
return true;
} else {
// 此时不是快乐数对计数器进行++
ret++;
// 对非快乐书 再次进行规则运算
n = count;
count = 0;
}
}
// 此时 给 一个指定值 表示结束情况
if (ret == 10) {
// 此时 10 次,差不多就可以校验出当前这个数是否为快乐数了
return false;
}
}
}
盛最多水的容器
盛最多水的容器
图一:
、
图二:
java:
// 单调性+双指针
public static int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int maxCubage = 0;
while (left != right) {
int nowWidth = right - left;
// 取最小值
if (height[left] < height[right]) {
maxCubage = Math.max(height[left] * nowWidth, maxCubage);
left++;
} else {
maxCubage = Math.max(height[right] * nowWidth, maxCubage);
right--;
}
}
return maxCubage;
}
python:
class Solution(object):
def maxArea(self, height):
left = 0
right = len(height) - 1
maxNumber = 0
while left < right:
maxNumber = max(min(height[left], height[right]) * (right - left), maxNumber)
if height[left] < height[right]:
left += 1
else:
right -= 1
return maxNumber