目录
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]和之前的元素都不同,
- 将nums[fast]的值赋值给nums[slow]
- 将slow的值加1,即指向下一个位置,新数组的长度也就加1了。
slow先增后用的原因:最后return的是新数组的长度,在判断那个元素可以了之后就应该让slow加1,不能先输出slow再加1。
fast先增后用的原因:fast最初等于1,前面已经用过fast=1了,应该让fast等于2了再进行下一次循环再判断。
在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);
}
}
在输入时要注意输入n
再换行输入数组元素,元素之间要注意空格
做这道题共计3h10m,花费了一上午的时间,现在算是弄的明明白白的了,现在在排队买饭,写完这一点就可以吃饭啦,哦吼吼开心开心~