題目
略,可以自己在(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即可。