首页 > 试题广场 >

删除升序数组的重复元素

[编程题]删除升序数组的重复元素
  • 热度指数:2297 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个升序排列的的长度为 n 的数组 nums,请你删除一部分这个数组的重复元素(数组元素需要原地改变),让这个数组的中每个数字都严格大于前一个数(第一个数除外),然后返回删除过后该数组的长度。

假设你返回长度是 m。如果 m 是正确答案,修改后的数组 nums 有 m 或 m 个以上个元素,并且前 m 元素符合要求,那么你的代码将被判为正确。

数据范围:数组的长度满足 1 \leq n \leq 10^5 \ ,数组中的数满足 1 \leq val \leq 10^9 \
示例1

输入

[1,2,3,4]

输出

4

说明

数组前一部分与原数组相同。
示例2

输入

[1,3,3,4,4,5]

输出

4

说明

重排后的数组是 [1,3,4,5,3,4] ,第一部分的长度是 4
题目测试用例[3,4,6,7,8,10,8,10]有问题
发表于 2022-03-26 16:55:34 回复(0)
这咋不是升序的?🤔
发表于 2022-03-22 20:42:33 回复(2)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int reArrangeArray (int[] nums) {
        int len = nums.length;
        if(len <= 1) return len;
        int left = 0, right = 0;
        while(right < len) {
            if(nums[left] != nums[right]) {
               nums[++left] = nums[right];
            } 
            right++;
        }
        return left + 1;
    }
}
发表于 2023-02-16 16:06:55 回复(0)
测试用例真的不怎么滴,错误的测试用例
发表于 2022-11-09 20:17:13 回复(0)
这题目就是来恶心人的,建议不做

发表于 2024-01-21 12:43:53 回复(0)
维护一个严格升序的前缀子数组的后边界。
遇到严格大于后边界的新元素,交换位置进行插入,前缀子数组长度增长。
整体类似插入排序。
class Solution {
public:
    int reArrangeArray(vector<int>& nums) {
        if (nums.size() == 1) {
            return 1;
        }
        int last = 0;
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] > nums[last]) {
                swap(nums[i], nums[last + 1]);
                last++;
            }
        }
        return last + 1;
    }
};


发表于 2023-05-14 22:39:09 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param nums int整型一维数组
 * @param numsLen int nums数组长度
 * @return int整型
 */
int reArrangeArray(int* nums, int numsLen ) {
    // write code here   
    int i=0;
    int j=0;
    int temp;
    while(j<numsLen){
        if(nums[i]==nums[j]){
            j++;
        }
        else{
            temp=nums[i+1];
            nums[i+1]=nums[j];
            nums[j]=temp;
            i++;
            j++;
        }
    }
    return i+1;
}

发表于 2023-01-05 18:25:31 回复(0)
错误的测试用例呀,预期输出的长度是4,数组里还有5个数呢。。。

发表于 2022-11-23 23:15:03 回复(0)
这题目就离谱

发表于 2022-09-19 19:27:50 回复(0)
双指针(快慢指针法)
import java.util.*;


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


发表于 2022-08-04 13:58:52 回复(0)
程序异常退出,请检查是否存在语法错误或者数组越界非法访问等情况
TypeError: oModule.reArrangeArray is not a function
注意:本题可能存在多个符合题目要求的输出,请自行判断程序是否通过。
为啥啊,是我没看懂题目吗?怎么都过不了?
发表于 2022-07-29 11:08:17 回复(0)
int reArrangeArray(vector<int>& nums) {
        // write code here
        if(nums.size()<=1)return nums.size();
        int slow=0,fast=1;
        while(fast<nums.size()){
            if(nums[slow]==nums[fast])
                nums.erase(nums.begin()+fast);
            else{
                slow++;
                fast=slow+1;
            }
        }
        return nums.size();
    }

发表于 2022-07-27 16:56:41 回复(0)
class Solution:
    def reArrangeArray(self , nums: List[int]) -> int:
        # write code here
        s = sorted(set(nums))
        # 原地改变
        for i in range(len(s)):
            nums[i] = s[i]
        return len(s)

发表于 2022-07-09 00:11:54 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int reArrangeArray (int[] nums) {
        // write code here
        if(nums==null||nums.length==1){
            return nums.length;
        }
        
        int i=0,j=1;
        while(j<nums.length){
            if(nums[i]==nums[j]){
                j++;
            }else{
                i++;
                nums[i]=nums[j];
                j++;
            }
        }
        
        return i+1;
    }
}
双指针解法


发表于 2022-07-01 17:44:32 回复(0)
public int reArrangeArray (int[] nums) {
        // write code here
        int n = nums.length;
        if (n < 2) return n;
        int i = 1, j = 1; // i,j 左右指针
        while (j < n) {
            if (nums[j] == nums[j - 1]) ++j;
            else nums[i++] = nums[j++];
        }
        return i;
        
    }


发表于 2022-05-17 11:50:49 回复(0)
class Solution:
    def reArrangeArray(self , nums: List[int]) -> int:
        # write code here
        res = sorted(set(nums))
        for i in range(len(res)):
            nums[i] = res[i]
        return len(res)

发表于 2022-04-24 11:19:00 回复(0)

问题信息

难度:
16条回答 1796浏览

热门推荐

通过挑战的用户

查看代码