首页 > 试题广场 >

删除升序数组的重复元素(二)

[编程题]删除升序数组的重复元素(二)
  • 热度指数:836 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 n 的有序数组 nums, 请你原地删除重复出现超过三次的元素,使每个元素出现最多两次,返回删除后新数组的长度 m ,你必须原地修改nums数组才能通过本题。
系统会如下来测试你的代码:
int[] rightNums = [...]; // 长度正确的答案
int m = removenums(nums); // 调用

assert m == rightNums.length;
for (int i = 0; i < m; i++) {
    assert nums[i] == rightNums[i];
}
如果所有断言都能通过,那么你的程序会被视为正确


数据范围: ,数组中的元素满足
示例1

输入

[1,1,2,2,3]

输出

5
[1,1,2,2,3]

说明

不用删除      
示例2

输入

[1,1,1,2,2,2,3,3]

输出

6
[1,1,2,2,3,3]

说明

删除第三个 1 和第三个 2 即可。      
int removenums(vector<int>& nums) {
        // write code here
         //记录当前数字出现次数
        int cnt = 1;      
        if(nums.size()<=1)return nums.size();
         //删除
        for(int i=nums.size()-2;i>=0;i--){
            if(nums[i]==nums[i+1]){
                cnt++;
                if(cnt>=3){
                    nums.erase(nums.begin()+i);
                }
            }else{
                cnt = 1;
            }
        }
        return nums.size();
    }
发表于 2023-05-16 22:12:44 回复(0)
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int removenums(vector<int>& nums) {
        // write code here
        unordered_map<int, int> m;
        for(int i=0; i<nums.size(); i++){
            m[nums[i]]++;
        }
        for(int j=nums.size()-1; j>=0; j--){
            if(m[nums[j]] >= 3){
                m[nums[j]]--;
                nums.erase(nums.begin()+j);
            }
        }
        return nums.size();
    }
};

发表于 2022-12-09 14:20:17 回复(0)
# -*- coding: utf-8 -*-


#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param nums int整型一维数组
# @return int整型
#
class Solution:
    """
    题目:
        https://www.nowcoder.com/practice/5b617a77d7654dc193bfe5c2bdaf5cc8?tpId=196&tqId=40525&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3FjudgeStatus%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=3&tags=&title=
    算法:
        使用i、j分别表示已调整数组的尾部+1,当前访问的元素下标;使用candidate和count分别统计当前元素以及出现次数
        初始:
            i, j = 1, 1
            candidate, count = nums[0], 1
        遍历nums:
            对于nums[i],若等于candidate:
                count += 1
                if count == 3:
                    continue
            否则:
                重新选取candidate = nums[i]
                count = 1
            nums[i] = candidate
            i += 1
    复杂度:
        时间复杂度:O(n)
        空间复杂度:O(1)
    """

    def removenums(self, nums):
        # write code here
        n = len(nums)

        i, j = 1, 1
        candidate, count = nums[0], 1

        while j < n:
            if nums[j] == candidate:  # 当nums[j]与当前候选人相等,count+1
                count += 1
            else:  # 不相等时,重新选取候选人
                candidate = nums[j]
                count = 1
            j += 1
            if count > 2:  # 一个候选人,只统计2次
                continue
            nums[i] = candidate
            i += 1

        # print nums[:i]
        return i


if __name__ == "__main__":
    sol = Solution()

    # nums = [1, 1, 2, 2, 3]

    nums = [1, 1, 1, 2, 2, 2, 3, 3]

    m = sol.removenums(nums)

    print nums[:m]

发表于 2022-06-26 20:46:22 回复(0)

问题信息

难度:
3条回答 1218浏览

热门推荐

通过挑战的用户

查看代码