leetcode202-快乐数
https://leetcode.cn/problems/happy-number/
一开始的错误代码
int sum;
if(n==1) return true;
while(n>9)
{
sum=0;
while(n)
{
sum += (n%10)*(n%10);
n /= 10;
}
if(sum==1) return true;
n=sum;
}
return false;
这里没有考虑到个位数可以不断平方的情况,属于看题不仔细+没有考虑周全。最后404个测试点有几个没通过。
正确做法:
1.循环一定次数(比如100)还没到1的话就不符合题目条件
2.使用集合set记录原始数字和每一次的next,每次循环都先检查是否已经存在,如果已经存在则说明存在循环,不符合题目条件
第二次提交的代码
class Solution {
public:
int next(int n)
{
int sum=0;
while(n)
{
sum += (n%10)*(n%10);
n /= 10;
}
return sum;
}
bool isHappy(int n) {
set<int> num;
while(num.find(n)==num.end())
{
num.insert(n);
if(n==1) return true;
n=next(n);
}
return false;
}
};
3.快慢指针
//参考英文网站热评第一。这题可以用快慢指针的思想去做,有点类似于检测是否为环形链表那道题
//如果给定的数字最后会一直循环重复,那么快的指针(值)一定会追上慢的指针(值),也就是
//两者一定会相等。如果没有循环重复,那么最后快慢指针也会相等,且都等于1。
class Solution {
public boolean isHappy(int n) {
int fast=n;
int slow=n;
do{
slow=squareSum(slow);
fast=squareSum(fast);
fast=squareSum(fast);
}while(slow!=fast);
if(fast==1)
return true;
else return false;
}
private int squareSum(int m){
int squaresum=0;
while(m!=0){
squaresum+=(m%10)*(m%10);
m/=10;
}
return squaresum;
}
}