演算法面試:陣列編碼面試問題
陣列資料結構的主要優點是,如果知道索引,它可以提供快速的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解決方案更通用,因為您可以使用它在整數陣列中查詢多個缺少的值。
相關文章
- golang 陣列面試題Golang陣列面試題
- 陣列的一些面試題陣列面試題
- 面試必問的陣列去重複面試陣列
- 詢問面試官的面試問題面試
- 一道遞迴陣列面試題遞迴陣列面試題
- 【面試題】從上向下列印陣列|||面試題陣列
- leetcode:面試題 01.08. 零矩陣(陣列,中等)LeetCode面試題矩陣陣列
- 【面試】面試常見問題整理面試
- 測試面試問題(二)面試
- 演算法面試通關40講 - 番外 - 陣列演算法面試陣列
- 面試必備:陣列和字串面試陣列字串
- 面試官問你陣列和ArrayList怎麼答?面試陣列
- 面試反問問題面試
- 演算法面試題演算法面試題
- Typescript 面試問題TypeScript面試
- iOS 面試問題iOS面試
- Pig面試問題面試
- Hive 面試問題Hive面試
- 面試題:面試經面試題
- Java面試必問面試題,你掌握了嗎?Java面試題
- HTML最新面試題(筆試面試題)HTML面試題筆試
- 演算法面試題(二)演算法面試題
- 演算法面試題:一演算法面試題
- php演算法面試題PHP演算法面試題
- leetcode面試經典150題- 189. 輪轉陣列LeetCode面試陣列
- 面試疑難問題面試
- 面試問題總結面試
- cmake Makefile面試問題面試
- 昨天的面試問題面試
- google經典演算法面試題-雞蛋問題Go演算法面試題
- 邦芒面試:面試時要問清楚的幾個問題面試
- 面試 HTTP ,99% 的面試官都愛問這些問題面試HTTP
- 面試程式碼題(華為)編輯距離面試
- 手撕面試官系列:BAT面試常問85題面試BAT
- 軟體測試面試問題(一)面試
- SQL崗位30個面試題,SQL面試問題及答案SQL面試題
- 【演算法工程師】Python面試問題總結演算法工程師Python面試
- Google 面試題 | 3個非重複子陣列最大和Go面試題陣列