3.21
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
代码
package org.example;
import java.util.Scanner;
public class Shuzu {
public int[] removeDuplicates(int[] nums) {
int n = nums.length;
if (n == 0) {
return nums;
}
int j = 0;
for (int i = 1; i < n; i++) {
if (nums[i] != nums[j]) {
j++;
nums[j] = nums[i];
}
}
// 创建一个新的数组来存储非重复元素
int[] result = new int[j + 1];
System.arraycopy(nums, 0, result, 0, j + 1);
return result;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 询问用户数组的长度
System.out.print("Enter the length of the array: ");
int length = scanner.nextInt();
// 创建一个指定长度的数组
int[] nums = new int[length];
// 读取用户输入的数组元素
for (int i = 0; i < length; i++) {
System.out.print("Enter element " + (i + 1) + ": ");
nums[i] = scanner.nextInt();
}
// 关闭Scanner对象
scanner.close();
// 创建Shuzu的实例
Shuzu shuzu = new Shuzu();
// 调用removeDuplicates方法并打印结果
int[] uniqueNums = shuzu.removeDuplicates(nums);
System.out.print("The unique elements of the array are: ");
for (int num : uniqueNums) {
System.out.print(num + " ");
}
}
}
主要流程
以数组[1 1 2 2 3 4 4 5]为例
1.i=0 j=0 时nums[i]=nums[j]=1,跳过,i+1,此时i=1 j=0;
2.nums[i]=nums[j],继续跳过i+1,此时i=2 j=0;
3.此时nums[i]=2,nums[j]=1,两者不相等,令nums[++j]=nums[i],此时j=1,i=3;数组变为[1 2 2 2 3 4 4 5]继续循环
4.nums[i]=2,nums[j]=2,相等,重复上面过程,最后数组变为[1 2 3 4 5 4 4 5]
5.
int[] result = new int[j + 1];
System.arraycopy(nums, 0, result, 0, j + 1);
return result;
用这段代码取数组前j+1位,得到结果