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

原文链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

最开始的解决思路:

  遍历2次数组;

  第一次,遍历整个数组,放置标记index1

  第二次,从每一个第一次遍历的元素index1后面开始遍历index2.

  然后,一个一个比较,重复的元素,删除后来再次重复的元素index2。 

  1. for index1 in range(0, len( num_list) - 1):
  2. for index2 in range(index1, len( num_list)):
  3. if num_list[index1] == num_list[index2]:
  4. del num_list[index2]

1.遇到的问题:每次del删除数组元素之后,数组本身以及数组长度发生变化,但是,for循环中的range()函数不会再次求值len(num_list)。

       导致,Num_list数组去重之后,缩短了,但是len(num_list)还是原来的长度。

       最终导致,数组越界异常。

 核心:数组可变,删除元素,导致数组长度变化。与遍历数组,冲突。

    解决方法:遍历比较功能,和删除元素功能分开。比较得到的重复元素,先进行标记,然后统一再删除。

  1. class Solution:
  2. def removeDuplicates(self, origin_list):
  3. length = len(origin_list)
  4. print(origin_list)
  5. #遍历比较
  6. #先取出第一个元素
  7. for index1 in range(0, length - 1):
  8. #再取出第二个元素
  9. for index2 in range(index1 + 1, length):
  10. #比较index1元素和index2元素2,如果index2重复则删除
  11. if origin_list[index1] == origin_list[index2]:
  12. #不能删除,则对要删除元素做标记
  13. origin_list[index2] = 'null'
  14. print(origin_list)
  15. #删除所有null值元素
  16. for ele in origin_list:
  17. if ele == 'null':
  18. origin_list.remove('null')
  19.  
  20. new_length = len(origin_list)
  21. return origin_list

2.遇到的问题: 

  1. 1 for ele in origin_list:
  2. 2 if ele == 'null':
  3. 3 origin_list.remove('null')

    这段代码,无法将origin_list列表中的重复值全部去除,

    原因:列表在remove时,本身发生了变化。列表的刚刚索引,也发生了变化。

    解决方法:使用while循环:

  1. while 'null' in num_list:
  2. num_list.remove("null")

3.遇到的问题:

  时间过长。

  解决方法:仔细看题发现,原来,本题是已经排好顺序的数组。所以index2没必要把index1后面全部遍历,只需要遍历到第一个和index1的值不同位置即可,后面就全都是不同值。

  1. class Solution:
  2. def removeDuplicates(self, origin_list):
  3. length = len(origin_list)
  4. #print(origin_list)
  5. for index1 in range(0, length - 1):
  6. for index2 in range(index1 + 1, length):
                #将重复值,标记成null,后面再统一删除
  7. if origin_list[index1] == origin_list[index2]:
  8. origin_list[index2] = 'null'
  9. else:
  10. break
  11. #print(origin_list)
            #将数组中的Null值全部删除
  12. while 'null' in origin_list:
  13. origin_list.remove('null')
  14. new_length = len(origin_list)
  15. return origin_list

总结:

  1.for循环:   

  1. x = 4
  2. for i in range(0, x):
  3. print(i)
  4. x = 5

  在for循环内部,改变X的值,不能改变迭代次数。

  因为,在执行for循环这行代码中,range()函数的参数X,在循环的第一次循环之前,就已经被python解释器求值(X=4),随后不会的循环中不会再次求值。

  例如:

  1. x = 4
  2. for j in range(x):
  3. for i in range(x):
  4. print(i)
  5. 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 倒序去重:

  1. for i in range(length -1, -1, -1):
  2. if origin_list[i] == 'null':
  3. del origin_list[i]

      

leetcode_day02的更多相关文章

随机推荐

  1. app上线

    不管第一次还是第二次APP上线都需要三样东西:开发者证书,appID,描述文件

  2. svn更改地址怎么办

    开发过程中有时会遇到服务器更换地址的情况,比如之前地址是 svn://www.aaa.com 后来换成了 svn://www.bbb.com 这时候怎么办呢?分客户端和服务器端2种情况处理 客户端: ...

  3. Java-笔记1

    /* 对第一个java程序进行总结 1. java程序编写-编译-运行的过程 编写:我们将编写的java代码保存在以".java"结尾的源文件中 编译:使用javac.exe命令编 ...

  4. printf、sprintf与fprintf 的用法区分

    原文链接 1: fprintf()#include <stdio.h> int fprintf( FILE *stream, const char *format, ... );fprin ...

  5. ReactiveObjC框架的简单介绍

    最近在一直在学习RAC框架的Object-C版本ReactiveObjC(Swift版本为ReactiveSwift),这篇文章简单展示一下学习的成果!!!如果有什么地方理解错误,欢迎大家指正!!!互 ...

  6. react事件绑定的三种常见方式以及解决Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state问题思路

    在 React 组件中,每个方法的上下文都会指向该组件的实例,即自动绑定 this 为当前组件. 而且 React 还会对这种引用进行缓存,以达到 CPU 和内存的优化.在使用 ES6 classes ...

  7. Navicat-12.0.26的激活

    1.卸载掉早期版本,卸载干净,然后安装最新版Navicat(使用群文件中Iobit uninstaller8卸载) 2.安装完成后将破解补丁复制到安装目录下,运行破解补丁. 4.先patch,然后选择 ...

  8. c语言可变参数函数

    c语言支持可变参数函数.这里的可变指,函数的参数个数可变. 其原理是,一般情况下,函数参数传递时,其压栈顺序是从右向左,栈在虚拟内存中的增长方向是从上往下.所以,对于一个函数调用 func(int a ...

  9. POJ-3126 BFS,埃式筛选及黑科技

    题目大意:给定两个四位素数a  b,要求把a变换到b,变换的过程要保证  每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数  与  前一步得到的素数  只能有一个位不同,而且每步得到的 ...

  10. POJ:3421-X-factor Chains(因式分解)(全排列)

    X-factor Chains Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7986 Accepted: 2546 Descr ...