这个题的错误和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; } };