问题描述

魔术师手中有A、2、3……J、Q、K十三张黑桃扑克牌。在表演魔术前,魔术师已经将他们按照一定的顺序叠放好(有花色的一面朝下).魔术表演过程为:一开始,魔术师数1,然后把最上面的那张牌翻过来,是黑桃A;然后将其放到桌面上;第二次,魔术师数1、2;将第一张牌放到这些牌的最下面,将第二张牌翻转过来,正好是黑桃2;第三次,魔术师数1、2、3;将第1、2张牌依次放到这些牌的最下面,将第三张牌翻过来正好是黑桃3;……直到将所有的牌都翻出来为止.问原来牌的顺序是如何的.

正确结果: [1, 8, 2, 5, 10, 3, 12, 11, 9, 4, 7, 6, 13]

解决方案

1. 列表

def solution_list():

pokers = [0 for _ in range(13)] # 初始化

count = len(pokers) # 纸牌总数

index = -1

for num in range(1, 14):

i = 0 # 计数

while i < num:

index = (index + 1) % count # 索引向前一步(可循环)

if pokers[index] == 0: # 当前元素为0时才计数, 不为0则跳过

i += 1

pokers[index] = num

print('#' * 50)

print(f'\n牌组: {pokers}\n')

print('#' * 50)

2. 单循环链表

class Node:

"""节点"""

def __init__(self, value):

self.data = value

self.next = None

def __repr__(self):

return f'Node: {self.data}'

class CircularLinkedList:

"""单循环链表"""

def __init__(self):

self.rear = None # 尾节点

def is_empty(self):

return self.rear is None

def append(self, elem):

"""尾插法"""

temp = Node(elem)

if self.rear is None:

temp.next = temp

self.rear = temp

else:

temp.next = self.rear.next

self.rear.next = temp

self.rear = temp

def print_all(self):

"""

按顺序打印全部节点

"""

if self.is_empty():

return

p = self.rear.next # 取得头部节点

print('Head', end='')

while True:

print('-->', p.data, end='')

if p is self.rear: # 到达尾部停止

break

p = p.next

print('-->Finish')

def solution_circular_linked_list():

pokers = CircularLinkedList()

for _ in range(13):

pokers.append(0)

temp = pokers.rear

for num in range(1, 14):

i = 0

while i < num:

temp = temp.next

if temp.data == 0:

i += 1

temp.data = num

print('#' * 50)

print('\n牌组: ')

pokers.print_all()

print('\n' + '#' * 50)

python随机发牌_魔术师发牌问题 -- python实现相关推荐

  1. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  2. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

  3. python内存泄漏_诊断和修复Python中的内存泄漏

    python内存泄漏 Fugue uses Python extensively throughout the Conductor and in our support tools, due to i ...

  4. python opencv手册_教你用Python实现5毛钱特效(给你的视频来点料)

    一.前言 请务必看到最后.Python牛已经不是一天两天的事了,但是我开始也没想到,Python能这么牛.前段时间接触了一个批量抠图的模型库,而后在一些视频中找到灵感,觉得应该可以通过抠图的方式,给视 ...

  5. python并行运算库_最佳并行绘图Python库简介:“ HiPlot”

    python并行运算库 HiPlot is Facebook's Python library to support visualization of high-dimensional data ta ...

  6. python自加_浅谈:为什么python没有自增运算符?

    前言 如果我们刚开始学的是C语言的话,肯定知道a++,b++这种自增模式,很大的便捷了我们.但是在python中使用a++,b++就会出现SyntaxError:invalid syntax出现无效语 ...

  7. python新手难点_初学两天python的操作难点总结

    已经学习两天python,将我认为的操作难点进行总结 1 在cmd下 盘与盘之间的切换 直接 D或d: 就好 2 查找当前盘或者文件下面的目录 直接 dir 3 想在一个盘下进去一个文件夹,用cd空格 ...

  8. 魔术师发牌java_魔术师发牌问题和拉丁布方阵

    本文利用经典的魔术师发牌问题与拉丁法阵分别讲解了循环链表与单向链表的使用,作为算法中的经典,对于链表的学习和理解都有着很大的帮助,不妨一看. 魔术师发牌问题 问题描述: 魔术师利用一副牌中的13张黑牌 ...

  9. python基本原理概论_怎样开始自学Python?

    本人才疏学浅,学识大多浅尝辄止,故文章若有错误,不论是文字笔误还是理解有错,烦请您留言以告知,本人必定感激不尽! **Python分类下的系列文章,不断更新中,如果你迫不及待地想要看看写得如何可以先试 ...

最新文章

  1. Squid故障与解决方法汇总
  2. 福布斯2015中国非上市潜力企业100强
  3. html固定中心,css 两边固定中间自适应布局的实现
  4. 用ppt画科研论文的图如何转eps
  5. javascript的垃圾回收机制指的是什么?
  6. 第十六周项目3-有相同数字?
  7. 完美:C# Blazor中显示Markdown并添加代码高亮
  8. LeetCode 1046. 最后一块石头的重量(priority_queue 堆)
  9. JavaScript-Tool:jquery.qrcode.js
  10. 原生js实现ajax
  11. 随机森林、gbdt算法
  12. linux常见功能代码,几种功能类似Linux命令汇总(示例代码)
  13. BusyBox 中添加新命令
  14. android拆轮子系列之一步一步教你写微信抢红包插件
  15. 国际结算三大方式之一——托收
  16. 用计算机编程解魔方,魔方程序 (详细的解释)
  17. RL(Chapter 4): Gambler’s Problem
  18. 1080i/p-HDTV
  19. java is setter_Java GetterSetter 系列之一:基础
  20. linux mfc驱动下载,Ubuntu 安装 Brother MFC7470D 驱动

热门文章

  1. 【PC工具】录屏软件,必须好用无广告!
  2. 北京、广东重名数量查询工具,给孩子起名重名查询
  3. 射频篇(三) 模拟、射频器件学习(3) ——锁相环(PLL)
  4. C++ 之类的静态成员
  5. 互联网与大数据将成为智能制造的基石
  6. FPGA在各行业的应用分析
  7. 用户空间与内核空间数据交换的方式(9)------netlink【转】
  8. 移动互联网服务客户端开发技巧 ( Webview及正则)
  9. WF4.0 基础篇 (二) Activity介绍及WriteLine Activity的使用
  10. 大量视频教程下载,全部是微软最新技术