数组去重(返回去重后的长度)
作者:互联网
给出一组有序的序列,其中有重复数字,要求原地去重,并给出去重后数组的长度。(不能额外开辟数组)
这道题,如果用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 }
逻辑其实很简单,来看看运行效果:
标签:arr,int,重后,System,length,数组,长度,指针 来源: https://www.cnblogs.com/EvanTheGreat/p/14999109.html