如何在不使用Java Collection API的情況下從陣列中刪除重複項
這是最近在Java技術訪談中向一位讀者詢問的編碼問題。問題是從整數陣列中刪除重複項而不使用任何集合API類,如Set或LinkedHashSet,這可以使此任務變得微不足道。通常,如果您需要為任何專案工作執行此操作,我建議更好地使用Set介面,特別是LinkedHashSet,因為這也保持了將元素插入到Set中的順序。僅從技術面試的角度來看,您需要使用迴圈或遞迴來執行此操作,具體取決於您最強的區域。在本文中,我正在分享一個幼稚的解決方案,它有很多限制,可以被視為生產質量程式碼,它不是最好的解決方案,但仍然是一個解決方案。
處理陣列時主要問題不是找到重複項,而是刪除它們。由於陣列是靜態的固定長度資料結構,因此無法更改其長度。這意味著,從陣列中刪除元素需要建立一個新陣列並將內容複製到該陣列中。
如果您的輸入陣列包含大量重複項,那麼這可能會導致大量臨時陣列。它還增加了複製內容的成本,這可能非常糟糕。鑑於此限制,您需要制定一個策略來最小化記憶體和CPU要求。
Java程式從沒有Collection的整數陣列中刪除重複項
在這個程式中,我們沒有使用任何集合類來刪除重複項,之前,我已經向您展示了一種從ArrayList中刪除重複項的方法,它使用的是LinkedHashSet。如果面試官沒有特別提及Collection,你仍然可以使用該解決方案。
您需要做的就是先將陣列轉換為ArrayList,然後再從該ArrayList建立一個LinkedHashSet。在這個例子中,我們透過不將它們複製到結果陣列中來從陣列中刪除重複項,這個解決方案實際上不是刪除重複項而是用預設值替換它,即零。
現在,讓我們看看我們的Java解決方案,用於從整數陣列中刪除重複項:
import java.util.Arrays; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Java program to remove duplicates from this array. You don't * need to physically delete duplicate elements, replacing with null, or * empty or default value is ok. * * @author http://javarevisited.blogspot.com */ public class TechnicalInterviewTest { private static final Logger logger = LoggerFactory.getLogger(TechnicalInterviewTest.class); public static void main(String args[]) { int[][] test = new int[][]{ {1, 1, 2, 2, 3, 4, 5}, {1, 1, 1, 1, 1, 1, 1}, {1, 2, 3, 4, 5, 6, 7}, {1, 2, 1, 1, 1, 1, 1},}; for (int[] input : test) { System.out.println("Array with Duplicates : " + Arrays.toString(input)); System.out.println("After removing duplicates : " + Arrays.toString(removeDuplicates(input))); } } /* * Method to remove duplicates from array in Java, without using * Collection classes e.g. Set or ArrayList. Algorithm for this * method is simple, it first sort the array and then compare adjacent * objects, leaving out duplicates, which is already in the result. */ public static int[] removeDuplicates(int[] numbersWithDuplicates) { // Sorting array to bring duplicates together Arrays.sort(numbersWithDuplicates); int[] result = new int[numbersWithDuplicates.length]; int previous = numbersWithDuplicates[0]; result[0] = previous; for (int i = 1; i < numbersWithDuplicates.length; i++) { int ch = numbersWithDuplicates[i]; if (previous != ch) { result[i] = ch; } previous = ch; } return result; } } Output : Array with Duplicates : [1, 1, 2, 2, 3, 4, 5] After removing duplicates : [1, 0, 2, 0, 3, 4, 5] Array with Duplicates : [1, 1, 1, 1, 1, 1, 1] After removing duplicates : [1, 0, 0, 0, 0, 0, 0] Array with Duplicates : [1, 2, 3, 4, 5, 6, 7] After removing duplicates : [1, 2, 3, 4, 5, 6, 7] Array with Duplicates : [1, 2, 1, 1, 1, 1, 1] After removing duplicates : [1, 0, 0, 0, 0, 0, 2] |
這就是如何在不使用集合類的情況下從Java中刪除重複陣列的方法。正如我之前所說,這個解決方案並不完美,並且有一些嚴重的侷限性,這是一個讓您去發現的練習。我可以給出的一個提示是,陣列本身可以包含作為重複項的預設值,例如0表示int,即使使用任何幻數,例如integer.max_值,也不能確定它們不會是輸入的一部分。
關於從結果陣列中永久刪除重複項,一種方法可以是計算重複項的數量,然後建立一個大小正確的陣列,即長度-重複項,然後將內容從中間結果陣列複製到最終陣列中,去掉標記為重複項的元素。
相關文章
- 刪除排序陣列中的重複項排序陣列
- javascript如何刪除陣列中重複的項JavaScript陣列
- 刪除有序陣列中的重複項 II陣列
- 題目:刪除排序陣列中的重複項排序陣列
- c#刪除有序陣列中的重複項C#陣列
- js刪除陣列中重複項的程式碼例項JS陣列
- LeetCode之從排序陣列中刪除重複項-SwiftLeetCode排序陣列Swift
- [12][02][26] 刪除排序陣列中的重複項排序陣列
- Leetcode[陣列] 26. 刪除排序陣列中的重複項LeetCode陣列排序
- js刪除陣列中重複的元素JS陣列
- js刪除陣列中的重複元素JS陣列
- 每日一題 [26] 刪除排序陣列中的重複項每日一題排序陣列
- 0026-刪除有序陣列中的重複項陣列
- javascript刪除陣列中重複元素程式碼例項JavaScript陣列
- js如何刪除陣列中重複的值JS陣列
- 刪除排序陣列中的重複數字排序陣列
- 使用Java Stream API中DistinctBy刪除重複資料JavaAPI
- javascript刪除陣列重複元素程式碼例項JavaScript陣列
- js刪除陣列重複元素程式碼例項JS陣列
- LeetCode 26 號問題 刪除陣列中的重複項LeetCode陣列
- leetcode-刪除排序陣列中的重複項+移除元素LeetCode排序陣列
- JavaScript 刪除陣列重複元素JavaScript陣列
- JavaScript陣列刪除重複元素JavaScript陣列
- javascript刪除陣列中的重複元素程式碼JavaScript陣列
- 每日一道演算法:刪除排序陣列中的重複項演算法排序陣列
- 我用演算法學golang(刪除有序陣列中的重複項 )演算法Golang陣列
- Golang刷LeetCode 26.刪除排序陣列中的重複項GolangLeetCode排序陣列
- JavaScript陣列刪除重複內容JavaScript陣列
- LeetCode每日一題:刪除排序陣列中的重複項(No.26)LeetCode每日一題排序陣列
- 從未排序的連結串列中刪除重複項排序
- 【演算法-初級-陣列】刪除排序陣列中的重複項(多語言版實現)演算法陣列排序
- javascript刪除陣列重複元素程式碼JavaScript陣列
- java陣列中重複元素的去重Java陣列
- js利用正規表示式刪除陣列中的重複元素JS陣列
- 讓我們一起啃演算法----刪除排序陣列中的重複項演算法排序陣列
- leetcode面試經典150-26. 刪除有序陣列中的重複項LeetCode面試陣列
- mysql 刪除重複項MySql
- 陣列刪除指定項陣列