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位,得到结果
posted @ 2024-03-21 21:04  xiaolllllin  阅读(9)  评论(0编辑  收藏  举报