數組(哈希表)的初始化問題-------LeetCode-202 引發的一些思考

題目

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章