java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...
java從數組查找指定整數
自從我討論任何編碼或算法面試問題以來已經有很長時間了,因此我想重新考慮一種最流行的基于數組的編碼問題,即在給定數組中查找缺失的數字。 在進行編程工作面試之前,您可能已經聽說過或看到過此問題,但是面試官通常會使用許多不同的版本來提高難度,以使候選人感到困惑并進一步測試其適應頻繁變化的能力。 在過去,我已經證明了如何找到一個排序的數組缺少的數量以及使用的BitSet(見Java中的無序整數數組這里 ),但是,只有一個丟失的數量,沒有任何重復。
這使問題有些容易,但是如果面試官告訴您數組包含重復項并且缺少多個數字,您該怎么辦? 好吧,這就是我們將在本文中討論的內容,但是在此之前,讓我們正確地獲取問題說明。
1.問題陳述:
您給定了一個大小為N的整數數組。該數組包含從1到N-1的數字,但是在包含重復項的數組中缺少幾個數字。 編寫一個Java程序以打印序列中缺少的數字。
例如,如果給定數組為
{1,1,2,3,5,5,7,9,9,9}那么它的長度
10,其中包含1到9之間的數字。在這種情況下,缺少的數字是4、6和8。
2.解決方案:
當你看到的問題是找到陣列失蹤人數 ,你可能會認為我們前面的解決方案計算所有數字的總和 ,并從預期的總和扣除它來尋找失蹤的數字,但不幸的是不會在這種情況下工作,因為更多缺少一個數字 ,并且其中包含重復項。
在這種情況下,我們需要使用其他方法,例如您在學校看到的點名通話。
老師有一個列出所有學生姓名的登記冊,他在列表中遍歷并用紅色標記缺席。 我們可以使用相同的方法來查找列表中所有缺少的數字。
我們可以將數組用作寄存器,并將索引用作數字名稱。 我們遍歷給定的數組,并通過存儲它們各自的索引之一來標記所有存在的數字。 例如,如果給定數組中的第一個數字為5(因為未對數組進行排序),則我們將1存儲在索引5中,例如register[5] = 1
給出所有數字后,就可以遍歷寄存器數組并打印所有值為零的索引。 這些人缺席或缺席。
該解決方案對于重復項也是安全的,因為如果一個數字出現一到兩次,我們只需將1存儲在相應的索引中即可。
3.代碼:
現在,我們知道如何解決帶有重復項的未排序整數數組中的數字丟失的問題,是時候將該解決方案轉換為代碼并運行Java程序了。
/** Java Program to find missing numbers in an integer* array with duplicates. Array may contains more* than one duplicates.* * input: {1, 1, 2, 3, 5, 5, 7, 9, 9, 9};* output: 4, 6, 8*/ public class Hello {public static void main(String[] args) {// given inputint[] input = { 1, 1, 2, 3, 5, 5, 7, 9, 9, 9 };// let's create another array with same length// by default all index will contain zero// default value for int variableint[] register = new int[input.length];// now let's iterate over given array to// mark all present numbers in our register// arrayfor (int i : input) {register[i] = 1;}// now, let's print all the absenteesSystem.out.println("missing numbers in given array");for (int i = 1; i < register.length; i++) {if (register[i] == 0) {System.out.println(i);}}}}Output missing numbers in given array 4 6 8這是解決此問題的最簡單的Java程序。 您可以看到我們已經對輸入數組進行了硬編碼,但是您也可以修改程序以通過使用Scanner類從用戶獲取輸入,如本示例所示。
該代碼與解決方案完全相同,我們通過復制原始數組的長度來創建另一個數組,并使用它標記存在的數字。
由于數組索引也是整數,并且它們在輸入值的范圍內,因此我們可以利用它們將其用作數據和元數據。 如果數組中包含的數字不在1到N-1之間,那么我們就不能使用數組。
以下是幻燈片中算法和代碼的摘要,以使您更好地理解:
4.分析
現在,是時候分析我們的解決方案,以便使用Big O表示法查找CPU和內存的復雜性。 如果看一下代碼,您會發現我們正在創建另一個具有相同大小的數組,這意味著它的內存或空間復雜度為O(n) 。
這意味著如果數組太大,即包含整數范圍內的所有數字,那么我們將有更多的內存可能不可用,并且我們的程序可能會在Java中拋出OutOfMemoryError 。 因為陣列需要連續的內存塊,所以這甚至更有可能。
因此,如果我們可以刪除實際上沒有容納任何內容的附加數組,并找到一種方法來存儲丟失的數字,而該數字遠遠小于我們可以改進此解決方案的所有數字,那么您會想到的。
對于時間復雜度 ,您可以看到我們遍歷整個數組以標記所有存在的數字,然后再次遍歷相同長度的另一個數組以查找缺席者。 這意味著該解決方案的時間復雜度為O(n)+ O(n)或O(2N),仍為Big O表示法仍為O(n) 。
如果我們找到在給定數組中進行迭代時打印缺席者的方法,則可以進一步改進此解決方案。 再說一遍,你們要想一想。
這就是在給定的整數array中查找缺失數字的經典問題 。 在這一部分中,我們找到了一種在未排序的數組中查找重復項的多個缺失數字的解決方案。 我們解決方案的時間和空間復雜度為O(n)。
翻譯自: https://www.javacodegeeks.com/2018/04/how-to-find-k-missing-numbers-in-integer-array-with-duplicates-in-java.html
java從數組查找指定整數
總結
以上是生活随笔為你收集整理的java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vmware用户名和密码_VMWare
- 下一篇: 一个赤一个者念什么字 一个赤一个者字的意