Java面試題——數組求和統計

牛牛有兩個長度爲nn的數組a, ba,b,牛牛但願統計有多少數對(l, r)(l,r)知足:java

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,雙份變量,雙份難度!所以最好整成一個變量,那怎麼辦?舉個例子spa

 
 要求解 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上的全部元素之和,則上述式子能夠表述爲code

圖片說明

求解數組sumArray則相對來講比較簡單了,具體的代碼以下:視頻

2,完整代碼blog

 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;
     }
 }

 

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

 

img

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

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

相關文章
相關標籤/搜索