Java题解01-删除排序数组中的重复项-双指针

 

目录

 

LeetCode代码

题解

 在eclipse中的写的代码

输出删除重复元素后数组的长度

输出删除重复元素的数组

自行输入数组元素

 

LeetCode代码

class Solution {
    public int removeDuplicates(int[] nums) {
        int len=nums.length;
        if(len==0){
            return 0;
        }
        int fast=1,slow=1;
        while(fast<len){
            if(nums[fast]!=nums[fast-1]){
                nums[slow]=nums[fast];
                ++slow;
            }
            ++fast;
        }
        return slow;
    }
}

题解

如果数组 nums 的长度为 0,则数组不包含任何元素,因此返回 0。

当数组nums的长度大于0时,数组中至少含有一个元素,在删除重复元素之后至少也剩下一个元素,所以,nums[0]就是删除后的第一个数组元素,可以不动,从下标1开始删除重复元素。

双指针,定义两个指针,初始时下标都为1

fast 快指针---遍历数组到达的下标位置

slow 慢指针---下一个要填入删除后的新数组的下标

 

快指针fast依次遍历从1到长度-1的每一个位置,对于每一个位置,如果nums[fast]!=nums[fast-1],将nums[fast]和前面的数比,说明nums[fast]和之前的元素都不同,

  1. 将nums[fast]的值赋值给nums[slow]
  2. 将slow的值加1,即指向下一个位置,新数组的长度也就加1了。

slow先增后用的原因:最后return的是新数组的长度,在判断那个元素可以了之后就应该让slow加1,不能先输出slow再加1。

fast先增后用的原因:fast最初等于1,前面已经用过fast=1了,应该让fast等于2了再进行下一次循环再判断。

3ab1fd9dd82b8d131d8bc65364fd2de7.png

 在eclipse中的写的代码

输出删除重复元素后数组的长度

package leetCode;

public class a_delete {
	public static void main(String[] args) {
		delete(2,4,6,6,7);
	}
	public static void delete(int...nums) {
		int len=nums.length;
		if(len==0) {
			System.out.println("0");
		}
		int fast=1,slow=1;
//快指针fast依次遍历从1到长度-1的每一个位置,对于每一个位置
//如果nums[fast]!=nums[fast-1],将nums[fast]和前面的数比,说明nums[fast]和之前的元素都不同,

//将nums[fast]的值赋值给nums[slow]
//将slow的值加1,即指向下一个位置,新数组的长度也就加1了。
		while(fast<len) {
			if(nums[fast]!=nums[fast-1]) {
				nums[slow]=nums[fast];
				++slow;
			}
			++fast;
		}
		System.out.println(slow);
	}
}	

输出删除重复元素的数组

package leetCode;

public class a_delete {
	public static void main(String[] args) {
		delete(2,4,6,6,7);
	}
//	输出删除重复元素的数组
	public static void delete(int...nums) {
		int len=nums.length;
		if(len==0) {
			System.out.println("0");
		}
//		从下标1开始比较,所以下标0的元素显示无法输出,则需单写一行输出nums[0];
//		比较出来的那个元素赋值给一个新的变量,循环输出那个新的变量
		int fast=1,m;
		System.out.print(nums[0]);
		while(fast<len) {
			if(nums[fast]!=nums[fast-1]) {
				m=nums[fast];	
				System.out.print(m);
			}
			++fast;
		}
		
		
	}
}

自行输入数组元素

package leetCode;

import java.util.Scanner;

public class a_delete {
	public static void main(String[] args) {
		delete(2,4,6,6,7);
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		
		int[] arr = new int[n];
		for(int i=0;i<n;i++) {
			arr[i]=in.nextInt();
		}
		in.close();
		delete(arr);
	}
//	输出删除重复元素后数组的长度
	public static void delete(int...nums) {
		int len=nums.length;
		if(len==0) {
			System.out.println("0");
		}
		int fast=1,slow=1;
		while(fast<len) {
			if(nums[fast]!=nums[fast-1]) {
				nums[slow]=nums[fast];
				++slow;
			}
			++fast;
		}
		System.out.println(slow);
	}
}

e6b9aa4cfa33408c9f11599d7e1c61cc.png

 在输入时要注意输入n

再换行输入数组元素,元素之间要注意空格


做这道题共计3h10m,花费了一上午的时间,现在算是弄的明明白白的了,现在在排队买饭,写完这一点就可以吃饭啦,哦吼吼开心开心~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值