數組去重(返回去重后的長度)


給出一組有序的序列,其中有重復數字,要求原地去重,並給出去重后數組的長度。(不能額外開辟數組)

這道題,如果用java的話,就肯定不能用set了。那我們可以用什么好辦法呢?這里介紹一下雙指針法。

什么是雙指針法?就是我們先定義兩個指針,一個快指針一個慢指針,分別指向數組的第二和第一個元素,快指針通過一個for循環不停地往后移,一旦碰到兩個指針所指向的元素的值相等,那么就把快指針指向的元素賦給慢指針指向元素的下一個,然后快指針繼續移動。等到遍歷到數組的最后一個元素時,結束循環,這個時候再把慢指針的值返回,就可以了。

 1 package com.hw.list0710;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Remove {
 6     private static int removeDuplicates(int[] arr){
 7         if(arr.length == 0){
 8             return 0;
 9         }
10         int i = 0; //定義一個慢指針
11         for(int j = 1;j < arr.length;++j){
12             //如果相等就讓j往后移,這沒影響,所以j是一個快指針
13             if(arr[i] != arr[j]){
14                 arr[++i] = arr[j];  //如果不相等,把j位置的元素賦給i的下一位
15             }
16         }
17         return i+1;
18     }
19 
20     public static void main(String[] args) {
21         int[] nums = null;
22         Scanner s = new Scanner(System.in);
23         System.out.println("數組長度:");
24         int len = s.nextInt();
25         nums = new int[len];
26         System.out.println("請按照從小到大的順序輸入數據:");
27         for(int i = 0;i < len;i++){
28             nums[i] = s.nextInt();
29         }
30         s.close();
31         int length = removeDuplicates(nums);
32         System.out.println("去重后的數組長度是:"+length);
33     }
34 }

邏輯其實很簡單,來看看運行效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM