题目
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环
但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
示例 1:
1 2 3 4 5 6 7
| 输入:n = 19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
|
示例 2:
提示
题解
这一题我的思路还是比较简单的,但是时间复杂度并不好:
就是先求出每个数字的每个位上的数,然后求平方和,看看是不是1
,是1
就return true
;不是的话存放在map
里,当然要判断这个时候的和是否已经出现了,因为又可能是无限循环的情况,如果已经出现了return false
就好了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Solution { public boolean isHappy(int n) { List<Long> num = getNum(n); HashMap<Long, Integer> sum = new HashMap<>(); int index = 0; while (true) { long sumTemp = 0; for (Long number : num){ sumTemp += number * number; } if (sumTemp == 1) { return true; } else { if (sum.containsKey(sumTemp)) { return false; } sum.put(sumTemp, index++); num = getNum(sumTemp); } } }
public List<Long> getNum(long n) { List<Long> res = new ArrayList<>(); while (n > 0) { res.add(n % 10); n /= 10; } return res; } }
|
再放一个快慢指针时间复杂度优秀的代码:
“快指针” 每次走两步,“慢指针”
每次走一步,当二者相等时,即为一个循环周期。这里快指针走的快,如果出现环了是一定可以追上慢指针的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class Solution { public int squareSum(int n) { int sum = 0; while(n > 0){ int digit = n % 10; sum += digit * digit; n /= 10; } return sum; }
public boolean isHappy(int n) { int slow = n, fast = squareSum(n); while (slow != fast){ slow = squareSum(slow); fast = squareSum(squareSum(fast)); }; return slow == 1; } }
|