题目重诉
问题:给你一个 升序排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k
个元素,那么 nums
的前 k
个元素应该保存最终结果。
将最终结果插入 nums
的前 k
个位置后返回 k
。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。、
题目输入示例:
1:
输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 函数应该返回新的长度 2,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。2:
输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。不需要考虑数组中超出新长度后面的元素。
提示:本篇文章采用java语言实现。
问题解题分析
首先问题中需要在一个有序递增数组中将重复的元素给原地去除,因为其有序递增,所以需要遍历这个数组,需要去除的数肯定是挨着的,在这里我选择使用栈来解决问题,就是将一个一个过来的数据加入栈中放入栈顶,加入条件就设定为是否与栈顶元素相同,如果不相同就将其加入栈中,遍历一遍后,再将栈的中数据一个一个的去除放入到数组中。
实现代码展示
1.实现类
代码如下(示例):
public int removeDuplicates(int[] nums) {
int la = nums.length;
Stack<Integer> scc = new Stack<>();
for(int i=0;i<la;i++){
if(scc.empty()){
scc.push(nums[i]);
}
else{
if(nums[i]!=scc.peek()){
scc.push(nums[i]);
}
}
}
int a = scc.size()-1;
int b = a+1;
while(!scc.empty()){
nums[a] = scc.pop();
a--;
}
return b;
}
2.实现代码
代码如下(示例):输入nums为:[1,1,3,4,4,5,5,6,7]
package 蓝桥杯;
import java.util.Stack;
public class quchu {
public static void main(String[] args) {
int[] sc= {1,1,3,4,4,5,5,6,7};
int sc1 = removeDuplicates(sc);
for (int i = 0; i < sc1; i++) {
if (i==0){
System.out.print("["+sc[i]+",");
}
else if (i==sc1-1){
System.out.print(sc[i]+"]");
}
else {
System.out.print(sc[i]+",");
}
}
}
public static int removeDuplicates(int[] nums) {
int la = nums.length;
Stack<Integer> scc = new Stack<>();
for(int i=0;i<la;i++){
if(scc.empty()){
scc.push(nums[i]);
}
else{
if(nums[i]!=scc.peek()){
scc.push(nums[i]);
}
}
}
int a = scc.size()-1;
int b = a+1;
while(!scc.empty()){
nums[a] = scc.pop();
a--;
}
return b;
}
}
2.运行结果展示
总结
提示:题目来源于力扣官网题库
所有算法题目都有很多很多种方法,每个人的 想法不同解题方式就不同,但是每个人的知识储量越多做的题越多,所找到的方案也就越多,也就月简便,所以希望大家不断学习,不断丰富自己,加油!