zoukankan      html  css  js  c++  java
  • Python3解《剑指》问题:“遇到奇数移至最前,遇到偶数移至最后”

    [本文出自天外归云的博客园]

    看到一个《剑指Offer》上的问题:“遇到奇数移至最前,遇到偶数移至最后。”

    我做了两种解法。一种是利用python内置函数,移动过程用了插入法,很简单。另一种是自定义与数字相关的类与函数,移动的过程用了指针思想。

    代码如下:

    '''
    解法1:利用python中与列表相关的内置函数
    '''
    from collections import deque
    
    
    def move_numbers(numbers: list, new_numbers=deque()):
        numbers = deque(numbers)
        while len(numbers) > 0:
            if numbers[0] % 2 == 0:
                number = numbers.popleft()
                new_numbers.append(number)
            else:
                number = numbers.popleft()
                new_numbers.appendleft(number)
        print(list(new_numbers))
    
    
    '''
    解法2:自定义与数字相关的类与函数
    '''
    
    
    class Numbers:
        header = None
        tail = None
        numbers = None
    
        class Number:
            def __init__(self, value):
                self.value = value
                self.next = None
    
        def __init__(self, *args):
            self.numbers = tuple([Numbers.Number(arg) for arg in args])
            self.install(self.numbers)
    
        def install(self, args: tuple):
            for i in range(len(args)):
                number = args[i]
                if i == 0 and len(args) > 1:
                    number.next = args[i + 1]
                    self.header = number
                if i > 0 and i < len(args) - 1:
                    number.next = args[i + 1]
                if i == len(args) - 1 and len(args) > 1:
                    self.tail = number
    
        def show(self):
            subs = []
            index = self.header
            while index:
                subs.append(index.value)
                index = index.next
            print(subs)
    
        def move(self):
            index = self.header
            new_header = None
            for i in range(len(self.numbers)):
                _next = index.next
                if index.value % 2 == 0:
                    index.next = None
                    self.tail.next = index
                    self.tail = index
                if index.value % 2 != 0 and i != 0:
                    if new_header:
                        index.next = new_header
                        new_header = index
                    else:
                        new_header = index
                        new_header.next = self.header
                    self.header = new_header
                index = _next
            self.show()
    
    
    '''
    题目:
        遇到奇数移动到最前面
        遇到偶数移动到最后面
    '''
    if __name__ == '__main__':
        numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
    
        # 解法1
        move_numbers(numbers)
    
        # 解法2
        Numbers(*numbers).move()

    其中:

    1. 内置数据类型collections.deque是python中的队列,在队头插入和弹出元素比list的insert和pop操作效率高

    2. 在main函数中将list类型的numbers转化为*args进行Numbers类对象初始化

  • 相关阅读:
    Python安装appium 遇见的报错
    appium
    QQ邮箱/微信邮箱发送邮件
    Python-变量
    神秘的咒语
    宿命的PSS
    E. Congruence Equation
    D. Substring
    leetcode 761. Special Binary String
    F
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/9305903.html
Copyright © 2011-2022 走看看