1. 程式人生 > 實用技巧 >Java面試題——陣列求和統計

Java面試題——陣列求和統計

牛牛有兩個長度為nn的陣列a, ba,b,牛牛希望統計有多少數對(l, r)(l,r)滿足:

1,0<=l<=r<=n-1

2,sum_{i= l}^{r}{a_i} = b_l + b_r∑i=lra**i=b**l+b**r

示例1

輸入

[1,2,3,4],[2,1,4,5]

輸出

4

說明

滿足條件的數對有(0, 1), (0, 2), (1, 1), (1, 2)(0,1),(0,2),(1,1),(1,2)

示例2

輸入

[0,0,1,1,1],[2,0,4,3,3]

輸出

2

1,結題思路

不使用暴力破解,因為會超時!如果想更快的解決這個問題,需要對於問題進行轉換;主要是這個公式:

這個公式比較難求解在具有兩個變數:l與r,雙份變數,雙份難度!因此最好整成一個變數,那怎麼辦?舉個例子


要求解 1+2+3+4+5+6 中第三個數字3到最後一個數字6之間的和可以怎麼求?
(1+2+3+4+5+6) - (1+2+3) + 3
有人說,那這樣不是很繁瑣???對的,但是這樣我們發現公式中的變數只剩下一個,即r或者l,怎麼說
我們令S(i)表示陣列A從0->i位置上的所有資料的和,則:
s(6) = (1+2+3+4+5+6)
S(3) = (1+2+3)
原來的式子就可以表示為:
S(6) - S(3) + A[3]
因此,我們只需要考慮如何求解S中的每個值即可

返回到原式中,可以根據上述描述將式子轉換為:

進一步調整兩邊的變數,得到最終的結果 sumArray[i]為陣列a中從位置0到位置i上的所有元素之和,則上述式子可以表述為

求解陣列sumArray則相對來說比較簡單了,具體的程式碼如下:

2,完整程式碼

 import java.util.*;
  
  
 public class Solution {
     /**
      * 計算有多少對符合條件的數對
      * @param a int整型一維陣列 陣列a
      * @param b int整型一維陣列 陣列b
      * @return int整型
      */
     public int countLR (int
[] a, int[] b) { // write code here int result = 0; int sumArray[] = new int[a.length]; sumArray[0] = a[0]; for(int i = 1; i <a.length; i++) sumArray[i] = sumArray[i-1] + a[i]; for(int l = 0; l < a.length; l++) for(int r = l; r <b.length; r++) if(sumArray[r] - b[r] == sumArray[l] - a[l] + b[l]) result++; return result; } }

最後的最後,上點乾貨。(但凡有個這樣的女朋友,我會熬夜麼?)

最後我把我收集的各大廠經典高頻面試題和Java高階進階、架構師視訊教程送予大家。部分資料如下圖所示:

獲取地址:java進階學習資料,面試題,電子書籍免費獲取