Python array.remove()未删除数组中的所有重复项
所以我在做一个问题,尽管函数已经通过了Python array.remove()未删除数组中的所有重复项,python,arrays,remove,Python,Arrays,Remove,所以我在做一个问题,尽管函数已经通过了测试用例,但我意识到有些地方不对劲 我有一个数组,它属于int类型,数组中可能有也可能没有重复的值。我需要做的是,删除所有重复项后,返回数组的len()。这应该在不创建新的数组的情况下完成,以获得O(1)时间效率 我找到了一个答案,它给出了一个很好的答案,我从中学到了一些新的东西,但我感到困惑的是下面的代码,它通过了测试用例,但通过在IDE中创建自己的代码,实际上并没有返回正确的返回长度。当我使用remove()方法时,它似乎只对数组中的第一个元素起作用。为
测试用例
,但我意识到有些地方不对劲
我有一个数组
,它属于int
类型,数组中可能有也可能没有重复的值。我需要做的是,删除所有重复项后,返回数组的len()
。这应该在不创建新的数组的情况下完成,以获得O(1)
时间效率
我找到了一个答案,它给出了一个很好的答案,我从中学到了一些新的东西,但我感到困惑的是下面的代码,它通过了测试用例,但通过在IDE中创建自己的代码,实际上并没有返回正确的返回长度。当我使用remove()
方法时,它似乎只对数组中的第一个元素起作用。为什么会这样
class Solution:
def removeDuplicates(self, nums):
if len(nums) <= 1:
return f"No duplicates as length is only {len(nums)}"
for i in nums:
if nums.count(i) > 1:
nums.remove(i)
return len(nums)
p = Solution()
print(p.removeDuplicates([1, 1, 1, 1])) # Should return 1, returns: 2
print(p.removeDuplicates([1, 1, 2, 5])) # Should return 3, returns: 3
print(p.removeDuplicates([1, 2, 1, 2, 1])) # Should return 2, returns: 3
print(p.removeDuplicates([1, 2, 2, 1, 4, 2, 2, 2])) # Should return 3, returns: 4
类解决方案:
def移除副本(自身、nums):
如果len(nums)1:
nums.remove(i)
返回长度(nums)
p=溶液()
打印(p.removeDuplicates([1,1,1,1])#应返回1,返回:2
打印(p.removeDuplicates([1,1,2,5])#应返回3,返回:3
打印(p.removeDuplicates([1,2,1,2,1]))#应返回2,返回:3
打印(p.removeDuplicates([1,2,2,1,4,2,2,2]))#应返回3,返回:4
如果查看函数的迭代部分:
以NUM表示的i的:
如果nums.count(i)>1:
nums.remove(i)
返回长度(nums)
您正在迭代列表nums
,然后从相同的num
列表中删除项目,这就是您面临的问题
记住:列表是可变的
为了避免这种情况,您可以迭代列表索引
,而不是迭代列表
本身,也可以创建一个全新的列表
第一种方法:
num=[1,1,1,1]
对于范围内的i(len(num)-1,-1,-1):#按相反顺序迭代以避免索引器错误
如果num.count(num[i])>1:
num.remove(num[i])
nums#[1]
第二种方法:
num=[1,1,1,1]
结果=[]
对于num中的i:
如果我没有结果:
结果.追加(i)
结果#[1]
如果查看函数的迭代部分:
以NUM表示的i的:
如果nums.count(i)>1:
nums.remove(i)
返回长度(nums)
您正在迭代列表nums
,然后从相同的num
列表中删除项目,这就是您面临的问题
记住:列表是可变的
为了避免这种情况,您可以迭代列表索引
,而不是迭代列表
本身,也可以创建一个全新的列表
第一种方法:
num=[1,1,1,1]
对于范围内的i(len(num)-1,-1,-1):#按相反顺序迭代以避免索引器错误
如果num.count(num[i])>1:
num.remove(num[i])
nums#[1]
第二种方法:
num=[1,1,1,1]
结果=[]
对于num中的i:
如果我没有结果:
结果.追加(i)
结果#[1]
为什么不使用set
?我不知道它会这样做,也没有想到它。。“我找到了一个答案,它给出了一个很好的答案,我从中学到了一些新东西”集合是无序的,尽管我认为你不能通过使用列表来实现O(1)
comlexity无论如何,这种逐个删除重复项的方法是O(N*M)
whereN=len(nums)
和M
是nums
中重复的总数,因为从列表中删除元素是O(N)
,您需要执行M次。这意味着在最坏的情况下,此解决方案具有二次运行时间!相比之下,len(set(nums))
只需检查每个数字一次,这意味着它的总运行时间为O(N)
。为什么不使用set
?我不知道它会这样做,一开始也没有想到。。“我找到了一个答案,它给出了一个很好的答案,我从中学到了一些新东西”集合是无序的,尽管我认为你不能通过使用列表来实现O(1)
comlexity无论如何,这种逐个删除重复项的方法是O(N*M)
whereN=len(nums)
和M
是nums
中重复的总数,因为从列表中删除元素是O(N)
,您需要执行M次。这意味着在最坏的情况下,此解决方案具有二次运行时间!相比之下,len(set(nums))
只需对每个数字进行一次检查,这意味着它的总运行时间为O(N)
。是的,第一种方法就是这样。我知道我可以通过创建一个新的列表来做到这一点,但问题明确要求我不要这样做。谢谢你的投入是的,第一种方法就是。我知道我可以通过创建一个新的列表来做到这一点,但问题明确要求我不要这样做。谢谢你的意见