题目比较简单,重点是理解思想
解法都在代码里,不懂就留言或者私信
面试的时候可以用我提交的解法,这个更优
java
class Solution {
/**第一种-常规解法,主要的思想是如果出现了循环或者等于1,计算过程就停止
如果等于1,说明是快乐术,否则就是出现了循环 */
public boolean isHappy2(int n) {
if(n == 1) {
return true;
}
/**我们用一个HashSet保存曾经出现过的数 */
Set<Integer> set = new HashSet<>();
int sum = n;
while(sum != 1 && !set.contains(sum)) {
/**注意这一句要放在最前面,因为下面sum马上要改变了,如果不放第一个,有可能初始sum会被忽略 */
set.add(sum);
/**记录当前数所有位的平方和 */
int curSum = 0;
/**取每一位的平方相加 */
while(sum != 0) {
int curNum = sum % 10;
curSum += curNum * curNum;
sum = sum / 10;
}
/**赋值给sum进行之后的计算 */
sum = curSum;
}
/**如果等于1退出的说明是快乐数,如果不是就是因为重复退出的,不是快乐数 */
return sum == 1;
}
/**第二种-找规律贪心,列举出一堆数后你会发现,只要sum不出现4就不会死循环,出现了1
就可以结束,我们就可以把循环条件变成sum != 1&& sum !=4
这个解法就不用set来记录了 */
public boolean isHappy(int n) {
if(n == 1) {
return true;
}
/**我们用一个HashSet保存曾经出现过的数 */
int sum = n;
while(sum != 1 && sum != 4) {
/**记录当前数所有位的平方和 */
int curSum = 0;
/**取每一位的平方相加 */
while(sum != 0) {
int curNum = sum % 10;
curSum += curNum * curNum;
sum = sum / 10;
}
/**赋值给sum进行之后的计算 */
sum = curSum;
}
/**如果等于1退出的说明是快乐数,如果不是就是因为重复退出的,不是快乐数 */
return sum == 1;
}
}