1.题目
Write an algorithm to determine if a number is "happy".
写一个算法,确定一个数字是否是快乐数字,有关快乐数字的定义可以参考百度百科 快乐数字
2.算法
我们从百度百科上发现,不是快乐数的数称为不快乐数(unhappy number),所有不快乐数的数位平方和计算,最後都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。题目中要求是确定是快乐数字就返回true,不是就返回false,所以我们用hashset放平方后的数的和,如果出现循环就不是快乐数
public boolean isHappy(int n) {
// Write your code here
if (n <= 0)
{
return false;
}
HashSet<Integer> hs = new HashSet<>();
hs.add(n);
while (n != 1)
{
int sum = calcu(n);
if (hs.contains(sum))
{
return false;
}
hs.add(sum);
n = sum;
}
return true;
}
private int calcu(int n) {
// TODO Auto-generated method stub
int sum = 0;
while (n != 0)
{
sum += Math.pow(n % 10, 2);
n /= 10;
}
return sum;
}
,其实我们可以这样做来减小空间复杂度,我们用一个快慢指针,如果循环,快慢指针就会在某一个地方相等
public boolean isHappy(int n) {
// Write your code here
if (n <= 0)
{
return false;
}
int slow, fast;
slow = fast = n;
do {
slow = calcu(slow);
fast = calcu(fast);
fast = calcu(fast);
if (fast == 1)
{
return true;
}
} while (fast != slow);
return false;
}
private int calcu(int n) {
// TODO Auto-generated method stub
int sum = 0;
while (n != 0)
{
sum += Math.pow(n % 10, 2);
n /= 10;
}
return sum;
}