数组(哈希表)的初始化问题-------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」呢?详情可以查看这位大牛的解析:

扫描二维码关注公众号,回复: 9888197 查看本文章

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即可。

发布了28 篇原创文章 · 获赞 15 · 访问量 8278

猜你喜欢

转载自blog.csdn.net/weixin_38976558/article/details/87902637
今日推荐