问题:
Write an algorithm to determine if a number is "happy".
A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.
Example: 19 is a happy number
- 1^2 + 9^2 = 82
- 8^2 + 2^2 = 68
- 6^2 + 8^2 = 100
- 1^2 + 0^2 + 0^2 = 1
解决:
①开心数的规则是每位数的和的平方之和最后会成为1,若中间有重复的和就不是开心数。耗时4ms.
public class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while(n != 1){
int sum = 0;
while(n != 0){
sum += (n % 10) * (n % 10);
n /= 10;
}
if (! set.add(sum)) {//存在重复
return false;
}
n = sum;
}
return true;
}
}
②不用set来做:我们并不需要太多的额外空间,关于非快乐数有个特点---循环的数字中必定会有4。耗时2ms.
public class Solution {
public boolean isHappy(int n) {
while(n != 1 && n != 4){
int sum = 0;
while(n != 0){
sum += (n % 10) * (n % 10);
n /= 10;
}
n = sum;
}
return n == 1;
}
}
③在discuss有如下解法:
public class Solution {//1ms
public boolean isHappy(int n) {
while(n > 6) {
int next = 0;
while(n > 0) {
next += (n % 10) * (n % 10);
n /= 10;
}
n = next;
}
return n == 1;
}
}