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;
}
}
标签:10,return,int,sum,fast,while,快乐,leetcode202
From: https://www.cnblogs.com/uacs2024/p/16652780.html