//哈希
哈希: 其实int 最大为9位 假如最大 13位9的快乐数为1053 极限快乐数 每位值都为9 相加 为1053 所以最大的快乐数为1053 只有开始题目给你的数可能使你第一步为1053 此后 都是小于243 而且结果只有2种可能 一是循环1 而是形成环循环 一但出现第二个重复的数 如果不是一 就是false 第二个重复的数是一 就true;
代码:
bool isHappy(int n) {
int hash[1060]={0};//记录遍历过的数
while(1)
{
int sum=0;
while(n)
{
int mid=n%10;
sum=sum+mid*mid;
n/=10;
}
if(hash[sum])
{if(sum==1) return true;
else return false;
}
hash[sum]++;
n=sum;
}
}
//快慢指针
关于循环的题可以快慢指针即是龟兔赛跑 快指针走俩步 慢指针走一步 快指针相对慢指针走一步 这2指针比在慢指针进入的第一圈相遇 若是一则true 否则是是环指针 其中相遇为环中一个节点值 必不为1 false
代码:
int end(int n) //创建找到下一个快乐数的函数
{
int sum=0;
while(n)
{int mid=n%10;
sum=sum+mid*mid;
n/=10;
}
return sum;
}
bool isHappy(int n) {
int low=n;
int fast=n;
do //因为初始化 刚开始相等 用do while
{
low=end(low); //慢指针走一步
fast=end(end(fast)); //快指针走二步
}while(fast!=low); //两者相遇跳出 low=fast
if(low==1) return true;
else return false;
}
最后一种是个这个题的巧劲 因为快乐数环循环中必有小于10的数 且只有1和7是快乐数
因此当快乐数小于10时跳出 判断是1和7 true 否则false
代码:
bool isHappy(int n) {
if(n==1) return true;
while(n>9)
{int sum=0;
while(n)
{
int mid=n%10;
sum=sum+mid*mid;
n/=10;
}
n=sum;
}
if(n==1||n==7) return true;
else return false;
}