一、题目描述
二、思路
计算n每个位置上数字的平方和sum,若是1,则return true;若重复出现过,代表进入了死循环,则return false;若不为以上情况则再次进入计算平方和。
三、解题过程
-
先创造一个函数去计算sum
int getSum(int n) {
int sum = 0;
while(n){
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
-
初始化 sum 和 记录sum出现次数的数组 hash[810]
- 因为n最大为十位数,而十个9的平方和为810,因此创造一个长度为810的数组去记录各个sum出现的次数:
int sum = getSum( n );
int hash[810] = { 0 };
-
判断sum:是否为1或是否重复出现过
- 每次循环都判断sun是否为1,且hash[sum]是否为0:若sum为1,则不再进入循环;若hash[sum]不为零,即sum重复出现过,则return false;若不属于上述两种情况,则继续更新sum的值:
while(sum != 1) {
if(hash[sum]) return false;
hash[sum] ++;
sum = getSum(sum);
}
四、代码
int getSum(int n) {
int sum = 0;
while(n){
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
bool isHappy(int n){
int sum = getSum( n );
int hash[810] = { 0 };
while(sum != 1) {
if(hash[sum]) return false;
hash[sum] ++;
sum = getSum(sum);
}
return true;
}
时间复杂度:O(n),空间复杂度:O(n)
五、改进
char* hash = (int*)calloc(sizeof(int),820);
//因为只存储0和1,一个字节就够了,则用char*可以节省内存