列表

详情


NC338. 删除升序数组的重复元素(一)

描述

给定一个升序排列的的长度为 n 的数组 nums,请你删除一部分这个数组的重复元素(数组元素需要原地改变),让这个数组的中每个数字都严格大于前一个数(第一个数除外),然后返回删除过后该数组的长度。
系统会如下来测试你的代码:
int[] rightNums = [...]; // 长度正确的答案
int m = reArrangeArray(nums); // 调用

assert m == rightNums.length;
for (int i = 0; i < m; i++) {
    assert nums[i] == rightNums[i];
}
如果所有断言都能通过,那么你的程序会被视为正确
数据范围:数组的长度满足 ,数组中的数满足

示例1

输入:

[1,2,3,4]

输出:

4
[1,2,3,4]

示例2

输入:

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

输出:

4
[1,3,4,5]

说明:

删除后的数组是 [1,3,4,5]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 39ms, 内存消耗: 4704KB, 提交时间: 2022-06-03

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int reArrangeArray(vector<int>& nums) {
        // write code here
        int n=nums.size();
        if(n==0)    return 0;
        vector<int>    temp;
        int data=-1;
        for(int i=0;i<n;i++)
        {
            if(nums[i]!=data)
                temp.push_back(nums[i]);
            data=nums[i];
        }
        int res=temp.size();
        nums.resize(res);
        nums=vector<int>{temp.begin(),temp.end()};
        return res;
    }
};

C++ 解法, 执行用时: 40ms, 内存消耗: 4344KB, 提交时间: 2022-04-14

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int reArrangeArray(vector<int>& nums) {
        // write code here
        int n = nums.size();
        for (int i=1; i<n; ++i) {
            if (nums[i-1] == nums[i]) {
                nums[i-1] = 0;
            }
        }
        
        int index1 = 0, index2 = 0;
        while (index2 < n) {
            while (index1 < n && nums[index1] != 0) {
                ++index1;
            }
            index2 = index1;
            while (index2 < n && nums[index2] == 0) {
                ++index2;
            }
            
            if (index2 < n) {
                swap(nums[index1], nums[index2]);
                ++index1;
                ++index2;
            }
        }
        
        nums.resize(index1);
        return nums.size();
    }
};

C 解法, 执行用时: 41ms, 内存消耗: 4576KB, 提交时间: 2022-04-07

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int reArrangeArray(int* nums, int numsLen ) {
    // write code here
    int i = 0, j = 1;
    for(;j < numsLen; j++){
        if(nums[i] != nums[j]) nums[++i] = nums[j];
    }
    return i+1;
}

C++ 解法, 执行用时: 41ms, 内存消耗: 4748KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int reArrangeArray(vector<int>& nums) {
        // write code here
        int n=nums.size();
        if(n==0)
            return 0;
        vector<int> temp;
        int data=-1;
        for(int i=0;i<n;i++)
        {
            if(nums[i]!=data)
                temp.push_back(nums[i]);
            data=nums[i];
        }
        int res=temp.size();
        nums.resize(res);
        nums=vector<int>{temp.begin(),temp.end()};
        return res;

    }
};

C++ 解法, 执行用时: 41ms, 内存消耗: 4792KB, 提交时间: 2022-06-25

class Solution {
  public:
    int reArrangeArray(vector<int>& nums) {
        int h = nums.size();
        if (h == 0) return 0;
        vector<int> v;
        int a = -1;
        for (int i = 0; i < h; i++) {
            if (nums[i] != a)
                v.push_back(nums[i]);
            a = nums[i];
        }
        int z = v.size();
        nums.resize(z);
        nums = vector<int> {v.begin(), v.end()};
        return z;
    }
};

上一题