zoukankan      html  css  js  c++  java
  • leetcode_day02

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

    原文链接: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 
    21         new_length = len(origin_list)
    22         return origin_list            

     2.遇到的问题: 

    1         for ele in origin_list:
    2             if ele == 'null':
    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]

     

          

  • 相关阅读:
    算法70----只有两个键的键盘【动态规划】
    Shell
    Shell
    Shell
    Shell
    Shell
    Tools
    Jenkins
    Java
    Product
  • 原文地址:https://www.cnblogs.com/tommyngx/p/10451811.html
Copyright © 2011-2022 走看看