給出一組有序的序列,其中有重復數字,要求原地去重,並給出去重后數組的長度。(不能額外開辟數組)
這道題,如果用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 }
邏輯其實很簡單,來看看運行效果:

