python语法问题


cnt = 0
nums = [1,2,2,5,6,7]
n = len(nums)
for i in range(n):
    for j in range(i+1,n):
        if nums[i]==nums[j]:
            for k in range(j,n-1):
                 nums[k] = nums[k+1]
            cnt+=1
expectedNums=n-cnt

这段代码的目的是删除有序数组的重复项,最后得到一个删除后数组新长度,为什么这段代码不对?

【以下回答由 GPT 生成】

这段代码不能正确地删除有序数组的重复项的原因是,它使用了一个嵌套的循环来遍历数组并找到重复的元素,然后将后面的元素向前移动来覆盖重复的元素。然而,在移动元素之后,数组的长度也发生了变化,而循环的范围仍然是基于最初的数组长度计算的,所以可能会漏掉一些重复元素或者操作超出数组边界。

为了解决这个问题,我建议使用一个指针来记录当前非重复元素的位置,然后遍历数组,如果当前元素与指针指向的元素不相等,则将当前元素赋值给指针指向的下一个位置,并将指针向前移动一位。这样做可以保证指针之前的元素都是非重复的,而指针之后的元素可以被忽略,最后返回指针的位置加一即可得到非重复元素个数。

下面是修改后的代码示例:

nums = [1,2,2,5,6,7]
n = len(nums)

if n == 0:
    expectedNums = 0
else:
    pointer = 0
    for i in range(1, n):
        if nums[pointer] != nums[i]:
            pointer += 1
            nums[pointer] = nums[i]

    expectedNums = pointer + 1

这样修改后的代码可以在O(n)的时间复杂度内完成删除重复项的操作,并且能够正确地删除有序数组中的重复元素。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你看这个

cnt = 0
nums = [1, 2, 2, 5, 6, 7]
n = len(nums)
for i in range(n):
    for j in range(i+1, n):
        if nums[i] == nums[j]:
            for k in range(j, n-1):
                nums[k] = nums[k+1]
            cnt += 1
            break
expectedNums = n - cnt