题目
略,可以自己在(https://leetcode-cn.com/problems/happy-number/submissions/)查看。本文不是对这个题进行讲解,而是对数组初始化进行讨论。
原因
本题目就是找一个“快乐数”,也就是每位数平方和相加是否为1,不是1的话继续讲下一个平方和的每位相加再进行平方和,于是就需要一直这样判断下去。有可能无限进行下午。
怎么得到终止条件呢?
答案:简历一个哈希表,只要有之前重复的值出现,那么就有“死循环”那么就直接判断为false即可。
论点
我就是建立一个hash表,本打算将所有元素赋值为-1,但是怎么就不对。源代码为:
class Solution {
public:
bool isHappy(int n) {
int nums[999]={-1};
int num=n;
int sum;
while(1)
{
sum=0;
while(num>0)
{
int temp=num%10;
sum+=temp*temp;
num/=10;
}
if(sum==1)
return true;
if(nums[sum]==-1)
nums[sum]=sum;
else
return false;
num=sum;
}
}
};
发现逻辑根本没问题,但是就是不对,所以就这开始考察我的耐心和调试能力了。(气的要死)
原因分析
最后才发现,是因为数组初始化出了问题:
int nums[999]={-1};
我这样初始化,只有第一位是-1,其他全部都是0.所以导致下一句判断语句判断为false:
if(nums[sum]==-1)
nums[sum]=sum;
else
return false;
所以第一个测试用例「19」,就给我判断为false.
后来直接把-1改成0就可以了,正确代码如下:
class Solution {
public:
bool isHappy(int n) {
int nums[999]={0};//修改处
int num=n;
int sum;
while(1)
{
sum=0;
while(num>0)
{
int temp=num%10;
sum+=temp*temp;
num/=10;
}
if(sum==1)
return true;
if(nums[sum]==0)//修改处
nums[sum]=sum;
else
return false;
num=sum;
}
}
};
为什么赋值的时候数组赋值不全是「-1」呢?详情可以查看这位大牛的解析:
https://blog.csdn.net/u014417133/article/details/77185009
大概及时因为:
数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值。
对于基本类型int来说,当然就是补int()即0了。再看一下非基本类型的数组:
string a[5] = { "foo" };
有了上面的规则,就很容易知道其实相当于:
string a[5] = { "foo", "", "", "", "" };
即后面4个元素调用了string的默认构造函数进行的初始化,而第一个则调用的string::string(const char*)进行的初始化。
还有:如果不明确指出初始化列表,那么基本类型是不会被初始化的(除全局变量和静态变量外),所有的内存都是“脏的”;而类类型则会为每个元素调用默认构造函数进行初始化。
所以大家一定要记住这个坑!!!不要在面试的时候或者上机的时候跳进去出不来,而且也找不到原因了。具体怎么初始化数组,大家参考:https://blog.csdn.net/dreamispossible/article/details/79968612即可。