欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

面向对象(OOP)与面向过程(OPP)的一道题目

程序员文章站 2024-03-23 18:24:52
...

题目:

500个小孩围成一圈,从第一个小孩开始计数,逢三出圈(逢三代表能被3整除,如6,27),那么最后留在圈内的孩子是第几个?

面向过程的解决办法

1、构造一个列表,模拟500个小孩,每个数字代表一个小孩
2、遍历列表标记应该出圈的小孩
3、删除标记的小孩,构建新的列表
4、再次遍历列表,标记要删除的小孩,注意,标记位置应该连续,就是接着上一次的开始,而不是每次都从0开始
5、循环以上操作、直到列表中只剩下一个小孩,这个数字就是孩子的编号

# 面向过程方式解决小孩和圈的题目

cycle = []
for i in range(500):
    cycle.append(i+1)
step = 1
while len(cycle) > 1:
    dels = []
    for kid in cycle:
        if step % 3 == 0:
            dels.append(kid)
        step += 1

    for kid in dels:
        cycle.remove(kid)

print(cycle)

面向对象的解决办法

# 面向对象方式解决小孩和圈的问题

# 第一个类 小孩 第二个类 圈
# 小孩属性: 编号 左手和右手
# 圈属性 : 头和尾   行为:加一个小孩进圈,移除一个小孩


class Kid:
    def __init__(self, gid):
        self.gid = gid
        self.left = None
        self.right = None


class Cycle:
    def __init__(self, count):
        self.head = None
        self.tail = None

        for i in range(count):
            self.add(Kid(i+1))

# 增加孩子的方法
    def add(self, kid):
        """向圈中增加一个小孩"""
        if self.head is None and self.tail is None:
            self.head = kid
            self.tail = kid
            kid.left = kid
            kid.right = kid
        else:
            kid.left = self.head
            kid.right = self.tail
            self.head.right = kid
            self.tail.left = kid
            self.tail = kid

# 移除孩子的方法
    def remove(self, kid):
        """从圈中移除这个小孩"""
        if kid is self.head:
            self.head = kid.left
        if kid is self.tail:
            self.tail = kid.right
        kid.left.right = kid.right
        kid.right.left = kid.left
        kid.left = None
        kid.right = None


# 调用 实例化
cycle = Cycle(500)

cur = cycle.head
step = 1
while cycle.head is not cycle.tail:
    cur = cur.left
    if step % 3 == 0:
        cycle.remove(cur.right)
    step += 1

print(cycle.head.gid)

相关标签: 笔记 python