关于c ++:为什么只有输入为5才会出现运行时错误?

why this got a runtime error only if input is 5?

这是leetcode的第338个问题,计算位。我想我已经完成了。但是当输入为5时,这些代码会得到一个运行时错误?但是为什么呢?

问题是:给定一个非负整数num。对于0≤i≤num范围内的每个数字i,计算其二进制表示形式中的1个数,并将其作为数组返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> binaryone(num+1);
        binaryone[0]=0;
        if(0==num)
            return binaryone;
        binaryone[1]=1;
        if(1==num)
            return binaryone;
        int w = 1 ;
        int i = 2;
        while(i<=num+1)
        {
            if(i<(pow(2,w-1)+pow(2,w-2)))
            {
                binaryone[i]=binaryone[i-pow(2,w-2)];
            }
            else
            {
                if(i<=(pow(2,w)-1))
                {
                    binaryone[i]=binaryone[i-pow(2,w-2)]+1;
                }
                else
                {
                    if(i==pow(2,w))
                        {
                            w++;
                            binaryone[i]=binaryone[i-pow(2,w-2)];
                        }
                }
            }
            i++;
        }
        return binaryone;
    }
};


我不认为这只会发生在5岁,而是你所有的投入。这是因为您在binaryone矢量中创建了num+1元素,方法是:

vector binaryone(num+1);

循环while(i<=num+1)正在索引一个超过零基索引元素末尾的元素,这会给您一个运行时错误。如果有n元素,则索引范围将从0 to n-1开始。

因此,将循环条件更改为:while(i