任务二:删除排序数组中的重复项

原文链接: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的更多相关文章

随机推荐

  1. centos6 编译安装gcc4.8.2

    12 wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-4.8.2/gcc-4.8.2.tar.gz 13 rm -r -f g ...

  2. 文本编辑器Vim技巧

    1.  导入文件内容  :r  文件名 2.  插入当前日期  :r  !date 3. :!which ls 4. :r !命令

  3. 在IDEA中创建Maven项目和添加tomcat

    IDEA中创建是一种创建maven项目的办法,但不推荐,因为没有使用统一的骨架,可以一开始就选择创建maven项目,步骤如下: 第一步 第二步:设置项目 第三步:进行配置好maven,加上 arche ...

  4. 第一个C#程序Hello World

    一.编写第一个C#程序——Hello World1. 启动Microsoft Visual Studio 2010.2. 点击“文件”菜单,选择“新建”项,在弹出的子菜单中选择“项目”命令.3. 弹出 ...

  5. django+xadmin在线教育平台(七)

    4-3 新建项目 Python2.7 创建虚拟环境. mkvirtualenv mxonline2 安装django pip install django==1.9.8 注意Python2下此处必须用 ...

  6. datatables 给字段设置默认值,屏蔽没有字段的错误

    我们返回的数据不能保证都是正常的,可能包含 null ,显然这个对于最终用户来说是不友好的,那么我们可以这么处理 先有如下数据格式: //示例数据 { data:[ {"id":1 ...

  7. 屏蔽datatable错误提示

    $.fn.dataTable.ext.errMode = 'none'; //不显示任何错误信息// 以下为发生错误时的事件处理,如不处理,可不管.$('#productionRequestItems ...

  8. Android和IOS网页不一致汇总

    1.input type=text 内容输入框的不一致,ios会默认给输入框添加自己的样式,导致在横向的输入框长度精准控制的时候,ios的输入框一般都比android上要长一点,还有内部阴影 解决此问 ...

  9. zookeeper集群(二)

    经过前一篇文章<zookeeper伪集群一>的阅读,相信大家对zookeeper集群已经有一定的了解了,接下来我们再谈谈zookeeper真集群.其实真集群和伪集群还是有很多相似的部分的, ...

  10. Python解压ZIP、RAR等常用压缩格式的方法

    解压大杀器 首先祭出可以应对多种压缩包格式的python库:patool.如果平时只用基本的解压.打包等操作,也不想详细了解各种压缩格式对应的python库,patool应该是个不错的选择. pato ...