Python 刷Leetcode题库,顺带学英语单词(26)

简介: Python 刷Leetcode题库,顺带学英语单词(26)

Remove Duplicates from Sorted List


Given a sorted linked list, delete all duplicates such that each element appear only once.   [#83]

Examples:
Input: 1->1->2
Output: 1->2
Input: 1->1->2->3->3
Output: 1->2->3



题意:给定已排序的链表,删除所有重复项,使每个元素只显示一次

遍历出链表所有元素,转化成列表处理掉重复项,再遍历列表创建结果链表

>>> class Node():
  def __init__(self, value=None, Next=None):
    self.val = self.value = value
    self.next = Next
  def __repr__(self):
    return f'NodeList[{self.val}->{self.next}]'
  def __str__(self):
    return f'{self.val}->{self.next}'
  @property
  def values(self):
    ret,cur = [],self
    while cur:
      ret.append(cur.val)
      cur = cur.next
    return ret
  def build(lst: list):
    ret = Node(lst[0])
    cur = ret
    for i in lst[1:]:
      cur.next = Node(i)
      cur = cur.next
    return ret
  def delDup(node):
    lst1,lst2 = [],node.values
    for i in lst2:
      if i not in lst1:
        lst1.append(i)
    return Node.build(lst1)
>>> in1 = Node.build([1,1,2])
>>> in1
NodeList[1->1->2->None]
>>> out1 = Node.delDup(in1)
>>> out1
NodeList[1->2->None]
>>> 
>>> in2 = Node.build([1,1,2,3,3])
>>> in2
NodeList[1->1->2->3->3->None]
>>> out2 = Node.delDup(in2)
>>> out2
NodeList[1->2->3->None]
>>> 



上面这是偷懒的做法,但遍历了2次,取值和创建节点各一次遍历。正规的做法只要遍历一次,在遍历的同时创建符合结果要求的节点链表,就相当于在有条件地复制一个已节点。用以下函数替换上面的 delDup() 其它不变,再做测试:

  def removeDup(node):
    ret = Node()
    p1,p2 = node,ret  # 相当于设置了2个“指针”
    while p1 is not None:
      if p1.val != p2.val:
        p2.next = Node(p1.val)
        p2 = p2.next
      p1 = p1.next    # “指针”向后移动
    return ret.next  # 加上.next 去掉“空”的“头节点”
>>> a = Node.build([1,1,2,3,3])
>>> Node.removeDup(a)
NodeList[1->2->3->None]
>>> b = Node.build([1,2,2,3,4,4,4,5])
>>> Node.removeDup(b)
NodeList[1->2->3->4->5->None]
>>> 



Remove Duplicates from Sorted List II


Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.   [#82]


Examples:
Input: 1->2->3->3->4->4->5
Output: 1->2->5
Input: 1->1->1->2->3
Output: 2->3



题意:给定已排序的链表,删除所有重复项,只留不重复元素

和上题一样,先遍历出数据,完成任务后再创建节点,也是偷懒的做法:

>>> class Node():
  def __init__(self, value=None, Next=None):
    self.val = self.value = value
    self.next = Next
  def __repr__(self):
    return f'NodeList[{self.val}->{self.next}]'
  def __str__(self):
    return f'{self.val}->{self.next}'
  @property
  def values(self):
    ret,cur = [],self
    while cur:
      ret.append(cur.val)
      cur = cur.next
    return ret
  def build(lst):
    ret = Node(lst[0])
    cur = ret
    for i in lst[1:]:
      cur.next = Node(i)
      cur = cur.next
    return ret
  def delDup2(node):
    lst1 = node.values
    lst2 = [i for i in lst1 if lst1.count(i)==1]
    return Node.build(lst2)
>>> in1 = Node.build([1,2,3,3,4,4,5])
>>> in1
NodeList[1->2->3->3->4->4->5->None]
>>> out1 = Node.delDup2(in1)
>>> out1
NodeList[1->2->5->None]
>>> in2 = Node.build([1,1,1,2,3])
>>> in2
NodeList[1->1->1->2->3->None]
>>> out2 = Node.delDup2(in2)
>>> out2
NodeList[2->3->None]
>>> 


这题的正规做法: 头、尾节点除外,只遍历所有中间节点,它们的值与前后两个节点值比较,都不相等才能进入结果链表;头节点只和自己的后续节点比较,尾节点只和自己的前驱节点比较。

def removeDup(node):
        ret = Node()
        p1,p2 = node,ret
        if not Node.isNode(p1.next):
                return node
        if p1.val != p1.next.val:
                p2.next = Node(p1.val)
                p2 = p2.next
        t = p1.val
        p1 = p1.next
        while p1.next is not None:
                if t != p1.val != p1.next.val:
                        p2.next = Node(p1.val)
                        p2 = p2.next
                t = p1.val
                p1 = p1.next
        if t != p1.val:
                p2.next = Node(p1.val)
        return ret.next if ret.next!=None else Node()
''''
# 测试结果:
>>> a = Node.build([1,2,3,3,4,4,5]);removeDup(a)
Node(1->2->5->None)
>>> b = Node.build([1,1,1,2,3]);removeDup(b)
Node(2->3->None)
>>>
>>> b = Node.build([1,1]);removeDup(b)
Node(None->None)
>>> b = Node.build([1,2]);removeDup(b)
Node(1->2->None)
>>> b = Node.build([1,2,2]);removeDup(b)
Node(1->None)
>>> b = Node.build([1,1,2]);removeDup(b)
Node(2->None)
>>> b = Node.build([0,0,1,2,2,2,3,3]);removeDup(b)
Node(1->None)
>>> b = Node.build([0,0,1,2,2,2,3]);removeDup(b)
Node(1->3->None)
>>> 
''''



目录
相关文章
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
65 6
|
5月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
130 2
|
3月前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
56 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
3月前
Leetcode(最后一个单词长度)
这篇文章介绍了两种解决LeetCode第58题的方法,即计算给定字符串中最后一个单词的长度,方法包括翻转字符串和逆向遍历统计。
23 0
|
3月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
27 0
|
3月前
|
小程序 IDE 开发工具
Python编写单词复习小程序
Python编写单词复习小程序
24 0
|
5月前
|
算法
LeetCode第58题最后一个单词的长度
LeetCode第58题"最后一个单词的长度"的解题方法,通过从字符串末尾向前遍历并计数非空格字符,直接得出最后一个单词的长度。
LeetCode第58题最后一个单词的长度
|
5月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
78 7
|
5月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
60 3
|
5月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
28 3