一,快乐数

解题思路:
本题给我们明确说明了,不管是快乐数还是不是快乐数,我们最后都会进入一个循环,快乐数也就是无限的1循环,因为1再怎么平方也是1,然后不是快乐数的阿虎就是无限循环但是不是1,这个怎么证明呢,就拿题目中的2来说,我们通过计算得知,在我们计算到后面的时候,就会再次出现4这个数字,就会陷入循环,所以我们这题的解题思路就是,通过快慢指针,在循环里面相遇之后,得到的数字是不是1

代码演示:
java
class Solution {
//写一个方法实现每个位置上的数字的平方和相加
public int sum(int n){
int sumn=0;
while(n!=0){
int x=n%10;
sumn +=x*x;
n=n/10;
}
return sumn;
}
public boolean isHappy(int n) {
//先定义a是第一个数字,也就是慢的那个。再定义b为计算一次的数字,也就是快的那个,至于为什么不定义一样的数字,因为我们要判断是否相等,如果一样的话直接跳出循环了
int a=n;
int b=sum(n);
while(a!=b){
a=sum(a);
b=sum(sum(b));
}
if(a==1){
return true;
}else{
return false;
}
}
}
二,盛最多水的容器

解题思路:
这题的核心也是使用双指针的方式,一个指针在最左边,一个指针在最右边,我们的容积=底*高,我们最开始最左以及最右就相当于是底是整个数组,然后我们就需要让相对较小的那一个数字指向的指针向内移动,这样才可能会出现高变高的情况,并且我们每次移动较小的那一边的指向一次,并且记录下来此时的容积大小,最后当我们的两个指针相遇的时候,我们就在刚刚计算的所有容积计算一个max,找到最大的就好了

代码演示:
java
class Solution {
public int maxArea(int[] height) {
int left=0;
int right=height.length-1;
int ret=0;
while(left<right){
//计算容积
int v=Math.min(height[left],height[right])*(right-left);
ret=Math.max(ret,v);
//较小的移动
if(height[left]>height[right]){
right--;
}else{
left++;
}
}
return ret;
}
}