leetcode_day02
任务二:删除排序数组中的重复项
原文链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

最开始的解决思路:
遍历2次数组;
第一次,遍历整个数组,放置标记index1
第二次,从每一个第一次遍历的元素index1后面开始遍历index2.
然后,一个一个比较,重复的元素,删除后来再次重复的元素index2。
for index1 in range(0, len( num_list) - 1):
for index2 in range(index1, len( num_list)):
if num_list[index1] == num_list[index2]:
del num_list[index2]
1.遇到的问题:每次del删除数组元素之后,数组本身以及数组长度发生变化,但是,for循环中的range()函数不会再次求值len(num_list)。
导致,Num_list数组去重之后,缩短了,但是len(num_list)还是原来的长度。
最终导致,数组越界异常。
核心:数组可变,删除元素,导致数组长度变化。与遍历数组,冲突。
解决方法:遍历比较功能,和删除元素功能分开。比较得到的重复元素,先进行标记,然后统一再删除。
class Solution:
def removeDuplicates(self, origin_list):
length = len(origin_list)
print(origin_list)
#遍历比较
#先取出第一个元素
for index1 in range(0, length - 1):
#再取出第二个元素
for index2 in range(index1 + 1, length):
#比较index1元素和index2元素2,如果index2重复则删除
if origin_list[index1] == origin_list[index2]:
#不能删除,则对要删除元素做标记
origin_list[index2] = 'null'
print(origin_list)
#删除所有null值元素
for ele in origin_list:
if ele == 'null':
origin_list.remove('null') new_length = len(origin_list)
return origin_list
2.遇到的问题:
1 for ele in origin_list:
2 if ele == 'null':
3 origin_list.remove('null')
这段代码,无法将origin_list列表中的重复值全部去除,
原因:列表在remove时,本身发生了变化。列表的刚刚索引,也发生了变化。
解决方法:使用while循环:
while 'null' in num_list:
num_list.remove("null")
3.遇到的问题:
时间过长。
解决方法:仔细看题发现,原来,本题是已经排好顺序的数组。所以index2没必要把index1后面全部遍历,只需要遍历到第一个和index1的值不同位置即可,后面就全都是不同值。
class Solution:
def removeDuplicates(self, origin_list):
length = len(origin_list)
#print(origin_list)
for index1 in range(0, length - 1):
for index2 in range(index1 + 1, length):
#将重复值,标记成null,后面再统一删除
if origin_list[index1] == origin_list[index2]:
origin_list[index2] = 'null'
else:
break
#print(origin_list)
#将数组中的Null值全部删除
while 'null' in origin_list:
origin_list.remove('null')
new_length = len(origin_list)
return origin_list
总结:
1.for循环:
x = 4
for i in range(0, x):
print(i)
x = 5
在for循环内部,改变X的值,不能改变迭代次数。
因为,在执行for循环这行代码中,range()函数的参数X,在循环的第一次循环之前,就已经被python解释器求值(X=4),随后不会的循环中不会再次求值。
例如:
x = 4
for j in range(x):
for i in range(x):
print(i)
x = 2
答案:
0
1
2
3
0
1
0
1
0
1
2.remove()函数,list.remove()会改变列表本身
3.列表去重:
3.1set():
ser(num_list)
3.2while去重:
while 重复值 in num_list:
num_list.remove(重复值)
3.3把列表复制一份,用新列表里面,重复元素的索引index值,删除原列表的值
3.4 倒序去重:
for i in range(length -1, -1, -1):
if origin_list[i] == 'null':
del origin_list[i]
leetcode_day02的更多相关文章
随机推荐
- IBM带库加磁带操作
1.查询要弹出磁带的信息 可查询media日志,冻结,可用等,详情可查 查看带库空闲槽位 vmcheckxxx -rt tld -rn 0(0为带库名) 磁带详细信息: bpmedialist -m ...
- 【转】你是不是也被Android Private Libraries、Referenced Libraries、android Dependency搞晕了~~
一.v4.v7.v13的作用和用法 1.Android Support V4, V7, V13是什么? 本质上就是三个java library. 2.为什么要有support库? 是为了解决软件的 ...
- 继续折腾LNK 2005错误
这次是因为要把一个很久的老项目改成使用Unicode字符集,又一次遇到了LNK 2005错误 先说说怎么把老项目改成Unicode字符集吧,首先要有足够的信心能把项目改好,比如我这次改的项目,也不算很 ...
- MySQL 中while loop repeat 的基本用法
-- MySQL中的三中循环 while . loop .repeat 求 1-n 的和 -- 第一种 while 循环 -- 求 1-n 的和 /* while循环语法: while 条件 DO 循 ...
- apache单ip配置多端口多站点
1.修改 /etc/httpd/conf/httpd.conf 添加一个Listen,如: Listen 80 Listen 8001 Listen 8002 2.添加一个VirtualHost #v ...
- 3、SpringBoot+MybatisPlus整合-------代码生成器
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</art ...
- ubuntu安装jdk6
我的ubuntu版本是12.04的64位的.由于ubuntu官方没有更新最新版的jdk6,所以我们只能主动去oracle公司网站去下载.网站地址:http://www.oracle.com/techn ...
- 洛谷P1968 美元汇率
题目背景 此处省略maxint+1个数 题目描述 在以后的若干天里戴维将学习美元与德国马克的汇率.编写程序帮助戴维何时应买或卖马克或美元,使他从100美元开始,最后能获得最高可能的价值. 输入输出格式 ...
- 记一次FTP下载踩坑的故(shi)事(gu)
下班前领导忽然要求我将客户的日志服务器上一些日志拷贝到测试服务器中,不过领导只提供给我FTP的连接方式,很明显就是要我用FTP方式去做啦 一般来说FTP批量下载也就上网随便找个脚本的事,但是却成了我疯 ...
- Linux系统崩溃,数据迁移
就在1小时前,处理了件如标题所述的麻烦事儿.吃完午饭,想对此作个总结,一来自己梳理下过程以便后面遇见类似的事可以 快速处理,二来同行的小伙伴们可以探讨下.故事是这样的,公司所在园区物业晚上断电8小时, ...