剑指offer52 构建乘积数组

 这个题的错误和c++ primier中名字的作用域例子相似。只是这里将int换成了vecto<int>这种形式。

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        int length = A.size();
        vector<int> B;
        if(length <= 1)
            return B;
        else
            vector<int> B(length,1);
        for(int i = 1;i < length;i++){
            B[i] = B[i-1] * A[i-1];
        }
        int tmp = 1;
        for(int j = length-2;j >= 0;j--){
            tmp *= A[j+1];
            B[j] *= tmp;
        }
        return B;
            
    }
};

这个代码报“段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起”的错误。

在else里新建了一个局部变量B,覆盖了全局变量。但两个for语句访问的B还是全局变量B,这个全局变量B是空的vector,所以会报错。

一种解决办法是将两个for语句放进else这个块作用域中

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        int length = A.size();
        vector<int> B;
        if(length <= 1)
            return B;
        else{
            vector<int> B(length,1);
            for(int i = 1;i < length;i++){
                B[i] = B[i-1] * A[i-1];
            }
            int tmp = 1;
            for(int j = length-2;j >= 0;j--){
                tmp *= A[j+1];
                B[j] *= tmp;
            }
            return B;
        }    
    }
};

另一种改变方式是对全局变量B进行改变。需要注意的是,vector<int> B(length,1)是定义变量并初始化,相当于申请了一个新的变量,只是这个变量名和全局变量的变量名相同。B = vector<int> (length,1)不是初始化,是一个赋值语句,不要认为vector<int> B没有给具体值就没有初始化,在定义的时候都进行了初始化,只是这里的初始化为空。对于自己设想的种种

情况以及这两种正确解法,可以把这个换成int a这种定义就方便理解了。

class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        int length = A.size();
        vector<int> B;
        if(length <= 1)
            return B;
        else
            B = vector<int> (length,1);
        for(int i = 1;i < length;i++){
            B[i] = B[i-1] * A[i-1];
        }
        int tmp = 1;
        for(int j = length-2;j >= 0;j--){
            tmp *= A[j+1];
            B[j] *= tmp;
        }
        return B;
            
    }
};
原文地址:https://www.cnblogs.com/ymjyqsx/p/6857214.html