删除排序数组中的重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:
比如:list nums=[0,0,1,3,6,3] 返回[0,1,3,6]
思路先找到重复元素所处的位置即第0位和第3位,位置为 [0,3]然后删除第0位和第3位,进而得到[0,1,3,6]。编码如下:用到了嵌套循环,即第0位需要和第1-5位比较,然后第1位和第2-5位进行比较,第2位和第3-5位进行比较,然后得到[0,3]。疑问:1、之后不清楚用什么办法删除第0位和第3位。因为用for循环和if语句总会把所有的0和3都删掉,或者删掉了第0位后得到一个新的list[0,1,3,6,3],然后此时第3位变成了第2位,所以导致删错数字。、、、(可参考方法三,for循环中倒着来,不会改变数字 索引)
nums=[0,0,1,3,6,3]
a=[]

for i in range(0,len(nums)-1):
for j in range(i+1,len(nums)):
if nums[i]==nums[j]:
a.append(i)
else:
pass

        #print('j:',j)
        j+=1
    #print('i:',i)                    
    i+=1        

print a
n=[]

输出:a为[0,3]

方法二: 用set函数**(最优方法)**
用set函数,因为
list1 = [1, 2, 3, 4, 5]
list2 = [1, 4, 5]
print list(set(list1) - set(list2))
输出:[2,3]
list1 = [1,2, 2, 3, 4, 5]
list2 = [1, 4, 5]
print list(set(list1) - set(list2))
输出:[2,3]即也会去掉list1中的重复数字
list1 = [1, 2, 3, 1]
print list(set(list1))
输出:123
在本题中用set函数,编码如下:
class Solution(object):
def removeDuplicates(self, nums):
“”"
:type nums: List[int]
:rtype: int
“”"
nums=list(set(nums))
print nums
return len(nums)
s=Solution()
print s.removeDuplicates([1,1,2])
输出:[1, 2]
2

方法三、 倒序,用pop函数删除
class Solution(object):
def removeDuplicates(self, nums):
“”"
:type nums: List[int]
:rtype: int
“”"
for i in range(len(nums)-1, 0, -1):
if nums[i] == nums[i-1]:
nums.pop(i)
print nums
return len(nums)
s=Solution()
print s.removeDuplicates([1,1,2])

输出:[1, 2]
2
弊端:如果list为[1,1,2,3,5,3]会输出[1, 2, 3, 5, 3],即依然没有考虑到重复数字不相临的情况
优点:请问为什么倒着删?
如果按正常顺序,删除重复数字的时候会改变列表中后续数字的索引,需要花费更多代码去解决这个问题。但是倒着删除不会影响前面的内容的索引

ls = [1,2,“a”,“y”,[1,2,3],“b”]
print(ls.pop(0))#删除第0个元素
print(ls)# 删除后的ls
print(ls.pop(3))#再删除第4个元素
print(ls)# 删除后的ls
print(ls.pop())#删除最后一个元素
print(ls)# 删除后的ls
输出:
1
[2, ‘a’, ‘y’, [1, 2, 3], ‘b’]
[1, 2, 3]
[2, ‘a’, ‘y’, ‘b’]
b
[2, ‘a’, ‘y’]

方法四、想用嵌套循环的方法改进方法三,没有调通、、
因为重复数字删除后,list的长度发生变化,则会提示越界,比如list长度为6时,i从5开始,i=5的时候在循环中删除了数字3则list长度变为了5,这时nums[5]就越界了
class Solution(object):
def removeDuplicates(self, nums):
“”"
:type nums: List[int]
:rtype: int
“”"
for i in range(len(nums)-1, 0, -1):
print(‘i1:’,i)
for j in range(0,i):
print(‘j:’,j)
print(‘i:’,i)
if nums[i] == nums[j]:
nums.pop(i)
j+=1
i=len(nums)-1
print nums
i-=1
print nums
return len(nums)
s=Solution()
print s.removeDuplicates([1,1,2,3,5,3])

方法五、再次审题原来题目中重复元素都是相邻的 不存在[1,1,2,3,5,3],题目中都是[0,0,1,1,1,2,2,5,6,6]这种形式的list

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值