演算法面試:陣列編碼面試問題

banq發表於2019-01-23
陣列是最基本的資料結構,它將元素儲存在連續的記憶體位置。這也是面試官最喜歡的話題之一,在任何編碼面試中,你都會聽到很多關於陣列的問題,例如,顛倒陣列、排序陣列或搜尋陣列中的元素。 
陣列資料結構的主要優點是,如果知道索引,它可以提供快速的0(1)搜尋,但是從陣列中新增和刪除元素的速度很慢,因為一旦建立了陣列,就無法更改其大小。 
要建立更短或更長的陣列,您需要建立一個新陣列並將所有元素從舊複製到新的。 
解決基於陣列的問題的關鍵是熟悉陣列資料結構以及基本程式設計建構函式,如迴圈,遞迴和基本運算子。 

問題: 

在給定的1到100的整數陣列中,如何查詢缺少的數字?
有關程式設計訪談的最常見問題之一是,編寫一個程式,用Java,C#或任何其他語言查詢陣列中缺少的數字。這種編碼面試問題不僅在小型初創企業中被問到,而且還在谷歌,亞馬遜,Facebook,微軟等一些最大的技術公司中提出,主要是當他們訪問知名大學的校園招聘畢業生時。這個問題的最簡單版本是在100個整數的區域中找到缺失的元素,其中包含1到100之間的數字。這可以透過使用n(n + 1)/ 2計算序列的總和來輕鬆解決,這是也是最快捷有效的方法之一,但如果陣列包含多個缺失的數字或者陣列包含重複項,則無法使用它。 

這給了面試官一些很好的後續問題,以檢查候選人是否可以應用他對略有不同的條件的知識。因此,如果您完成此操作,他們會要求您在重複陣列中找到缺少的數字。這可能很棘手但你很快就會發現在陣列中找到缺失和重複數字的另一種方法是對它進行排序。 

在排序陣列中,您可以比較數字是否等於預期的下一個數字。或者,您也可以使用Java中的BitSet來解決此問題。 
如何使用Java程式找到缺少的數字 
首先理解問題陳述,我們將1到100的數字放入整數陣列中,找出丟失的數字的最佳方法是什麼?如果訪問者特別提到1到100,那麼你可以應用上述關於系列總和的技巧,如下所示。如果它有多個缺少的元素,你可以使用BitSet類,當然只有你的面試官允許它。

1)系列之和:公式:n(n + 1)/ 2(但只適用於一個缺失的數字) 
2)如果陣列有多個缺少的元素,請使用BitSet。

BitSet解決方案,是很好的實用程式類。在許多面試中,當向Java開發人員詢問時,他們中的許多人甚至都沒有意識到這一點。這個問題是學習如何在Java中使用BitSet的好方法。 

如果你要去面試,那麼除了這個問題之外,最好還要知道如何在陣列和程式中找到重複數字以及找到整數陣列中的第二高數字。通常情況下,這些問題會作為後續問題出現。 

import java.util.Arrays;
import java.util.BitSet;
 /** 
* Java program to find missing elements in a Integer array containing 
  * numbers from 1 to 100. 
* 
* @author Javin Paul 
*/
public class MissingNumberInArray {
 
     public static void main(String args[]) {

        // one missing number
        printMissingNumber(new int[]{1, 2, 3, 4, 6}, 6);
 
        // two missing number
        printMissingNumber(new int[]{1, 2, 3, 4, 6, 7, 9, 8, 10}, 10);
 
        // three missing number
        printMissingNumber(new int[]{1, 2, 3, 4, 6, 9, 8}, 10);
 
        // four missing number
        printMissingNumber(new int[]{1, 2, 3, 4, 9, 8}, 10);
 
        // Only one missing number in array
        int[] iArray = new int[]{1, 2, 3, 5};
        int missing = getMissingNumber(iArray, 5);
        System.out.printf("Missing number in array %s is %d %n", 
                           Arrays.toString(iArray), missing);
    }
   /**    
* A general method to find missing values from an integer array in Java.    
* This method will work even if array has more than one missing element.
*/
    private static void printMissingNumber(int[] numbers, int count) {
        int missingCount = count - numbers.length;
        BitSet bitSet = new BitSet(count);
 
        for (int number : numbers) {
            bitSet.set(number - 1);
        }
 
        System.out.printf("Missing numbers in integer array %s, with total number %d is %n",
        Arrays.toString(numbers), count);
        int lastMissingIndex = 0;

        for (int i = 0; i < missingCount; i++) {
            lastMissingIndex = bitSet.nextClearBit(lastMissingIndex);
            System.out.println(++lastMissingIndex);
        }
 
    }
   /**    
* 在陣列中查詢缺失數的 java方法
* 僅1到n之間的數字.    
* 可用於查詢整數陣列中缺少的元素
*數字從1到100或1-1000    
*/
    private static int getMissingNumber(int[] numbers, int totalCount) {
        int expectedSum = totalCount * ((totalCount + 1) / 2);
        int actualSum = 0;
        for (int i : numbers) {
            actualSum += i;
        }
 
        return expectedSum - actualSum;
    }
 
}

輸出:

Missing numbers in integer array [1, 2, 3, 4, 6], with total number 6 is
5
Missing numbers in integer array [1, 2, 3, 4, 6, 7, 9, 8, 10], with total number 10 is
5
Missing numbers in integer array [1, 2, 3, 4, 6, 9, 8], with total number 10 is
5
7
10
Missing numbers in integer array [1, 2, 3, 4, 9, 8], with total number 10 is
5
6
7
10
Missing number in array [1, 2, 3, 5] is 4


您可以看到,使用正確的資料結構如何輕鬆解決問題,這是這個程式的關鍵收穫,瞭解這個技巧是很好的,它只需要計算數字的和,然後從實際的和中減去它,但是如果陣列中缺少一個以上的數字,就不能使用這個技巧。另一方面,位集Bitset解決方案更通用,因為您可以使用它在整數陣列中查詢多個缺少的值。

相關文章