重磅乾貨,第一時間送達程序員
構建乘積數組面試
給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],
其中B中的元素B[i]=A[0]A[1]...A[i-1]A[i+1]...A[n-1]。
不能使用除法。正則表達式
爲了方便理解題目,下面舉個例子
A=[1, 2 , 3, 4]
B=[234, 134, 124, 123]算法
若是能夠用除法的話:那就比較容易了數組
因此不能使用除法,那就只能從乘法角度來看這道題目了。微信
如上圖所示,能夠發現:數據結構
B[i]的左半部分(紅色部分)和B[i-1]有關(將B[i]的左半部分乘積當作C[i],有C[i]=C[i-1]*A[i-1]), B[i]的右半部分(紫色部分)與B[i+1]有關(將B[i]的右半部分乘積當作D[i],有D[i]=D[i+1]*A[i+1]
所以咱們先從0到n-1遍歷,計算每一個B[i]的左半部分; 而後定義一個變量temp表明右半部分的乘積,從n-1到0遍歷,令B[i]=temp,而每次的temp與上次的temp關係即爲temp=A[i+1]。機器學習
Python :ide
class Solution: def multiply(self, A): # write code here B=[1]*len(A) for i in range(1,len(A)): B[i]=B[i-1]*A[i-1] tmp=1 for j in range(len(A)-2,-1,-1): tmp *= A[j+1] B[j]*= tmp return B
C++函數
class Solution { public: vector<int> multiply(const vector<int>& A) { vector<int> B; int length = A.size(); for(int i=0;i<length;i++) { int number=1; for(int j = 0;j<length;j++){ if(j==i)continue; number *= A[j]; } B.push_back(number); } return B; } };
JAVA
public class Solution { public int[] multiply(int[] A) { if(A.length <= 1) return A; int [] B = new int[A.length]; B[0] = 1; for(int i = 1; i < A.length; i++){ B[i] = B[i-1] * A[i-1]; } int temp = 1; for(int j = A.length - 2; j>=0; j--){ temp *= A[j+1]; B[j] *= temp; } return B; } }
注:面試季來了,無論是做爲面試者仍是之後做爲面試官,瞭解算法這門程序員之間的溝通方式都是很是必要的。找過工做的朋友應該都據說過《劍指offer》,雖然書中只有六十多道題目,可是道道都是經典。
若是是單純的面試需求,劍指offer的優先級確定是在Leetcode以前,總的說它有三個優勢:
它的缺點是:
劍指offer刷題交流羣
掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆)
▲長按加羣