一、题目描述

二、解法
class Solution { public boolean isHappy(int n) { /** * 方法1:用Set检测循环 */ /*Set<Integer> set = new HashSet<>(); while (n != 1) { if (set.contains(n)) { //如果存在,说明陷入了死循环 return false; } set.add(n); n = squareSum(n); } return true;*/ /** * 方法2:类似于快慢指针的思想。 * 慢指针每次做一次转换,快指针每次做两次转换 * 如果出现死循环,那么快的指针(值)一定会追上慢的指针(值) * 如果没有循环重复,那么最后快慢指针也会相等,且都等于1。 */ int fast = squareSum(n); int slow = n; while (fast != 1 && fast != slow) { fast = squareSum(squareSum(fast)); slow = squareSum(slow); } return fast == 1; } // 把一个数替换成每一位的平方和 private int squareSum(int num) { int res = 0; while (num != 0) { // 一定要牢记代码实现取出各个位数字的思路 int temp = num % 10; num /= 10; res += temp * temp; } return res; } }