当前位置: 面试刷题>> 删除有序数组中的重复项(经典算法150题)


题目描述

给定一个排序后的数组 nums,你需要在原地删除重复出现的元素,使得每个元素只出现一次,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,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。
你不需要考虑数组中超出新长度后面的元素。

PHP 代码示例

function removeDuplicates(&$nums) {
    if (empty($nums)) {
        return 0;
    }
    
    $length = count($nums);
    $index = 1; // 从索引1开始,因为第一个元素一定不重复
    
    for ($i = 1; $i < $length; $i++) {
        if ($nums[$i] != $nums[$i - 1]) {
            $nums[$index] = $nums[$i];
            $index++;
        }
    }
    
    return $index;
}

// 示例用法
$nums = [1, 1, 2];
$newLength = removeDuplicates($nums);
echo "新长度为: $newLength, 修改后的数组为: ";
print_r($nums);

Python 代码示例

def removeDuplicates(nums):
    if not nums:
        return 0
    
    index = 1
    for i in range(1, len(nums)):
        if nums[i] != nums[i - 1]:
            nums[index] = nums[i]
            index += 1
    
    return index

# 示例用法
nums = [1, 1, 2]
new_length = removeDuplicates(nums)
print(f"新长度为: {new_length}, 修改后的数组为: {nums[:new_length]}")

JavaScript 代码示例

function removeDuplicates(nums) {
    if (nums.length === 0) {
        return 0;
    }
    
    let index = 1;
    for (let i = 1; i < nums.length; i++) {
        if (nums[i] !== nums[i - 1]) {
            nums[index] = nums[i];
            index++;
        }
    }
    
    return index;
}

// 示例用法
let nums = [1, 1, 2];
let newLength = removeDuplicates(nums);
console.log(`新长度为: ${newLength}, 修改后的数组为: ${nums.slice(0, newLength)}`);

在解答这类算法题时,理解题目要求和限制是非常重要的。同时,通过实际编写代码来验证思路也是必不可少的。希望这些示例能帮助你更好地理解题目并顺利解答。

推荐面试题