1. 程式人生 > >陣列中重複的資料

陣列中重複的資料

給定一個整數陣列 a,其中1 ≤ a[i] ≤ n(n為陣列長度), 其中有些元素出現兩次,而其他元素出現一次

找到所有出現兩次的元素。

你可以不用到任何額外空間並在O(n)時間複雜度內解決這個問題嗎?

示例:

輸入:
[4,3,2,7,8,2,3,1]

輸出:
[2,3]

題目分析:

使用額外陣列處理:使用新的陣列存放資料

定義的新陣列儲存元素的方式為:其下標是陣列a中的元素,這樣,只要元素在陣列a中出現一次,新陣列中此元素位置的值就加1,最後遍歷新陣列,如果新陣列中對應位置的值大於1,就返回此位置,即陣列a中的元素;

題目中給出1 ≤ a[i] ≤ n(n為陣列長度),所以陣列a中最大的數只可能是陣列的長度,所以新陣列的大小要定為n + 1(下標從0開始),

程式碼實現:

public List<Integer> findDuplicates(int[] nums) {
   List<Integer> list = new LinkedList<>();
   int n = nums.length;
   int[] temp = new int[n + 1];
   for (int i = 0; i < nums.length; i++) {
       temp[nums[i]] += 1;
   }
   for (int i = 0; i < temp.length; i++
) { if (temp[i] > 1) list.add(i); } return list; }

主函式:

public static void main(String[] args) {
   A3 a = new A3();
   int[] nums = {4,3,2,7,8,2,3,1};
   List resList = a.findDuplicates(nums);
   for (int i = 0; i < resList.size(); i++) {
       System.out.print
(resList.get(i) + " "); } }

執行結果:

2 3