構建乘積數組
阿新 • • 發佈:2017-05-15
調用 註意 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; } };
構建乘積數組