1. 程式人生 > >構建乘積數組

構建乘積數組

調用 註意 col 發生 構建 例子 進行 vector for語句

這個題的錯誤和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;
            
    }
};

構建乘積數組