面向对象(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九九乘法表
推荐阅读
-
面向对象(OOP)与面向过程(OPP)的一道题目
-
利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现,
-
利用php给图片添加文字水印面向对象与面向过程俩种方法的实现
-
利用php给图片添加文字水印-面向对象与面临过程俩种方法的实现
-
利用php给图片添加文字水印-面向对象与面临过程俩种方法的实现
-
Java 7 -- 类与对象(1)(面向对象与面向过程的区别;对象、方法)
-
利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现,
-
利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现,_PHP教程
-
利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现
-
利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现,_PHP教程