【算法趣题】 Q03 翻牌

浏览: 1781

前言

【算法趣题】是来自图灵程序设计丛书绝云译的《程序员的算法趣题》,书中是用Ruby实现的。这里是用python来实现。

问题描述

有100张写着数字1~100的牌,并按顺序排列着。最开始所有牌都是背面朝上放置。我现在从第2张牌开始,隔一张牌翻牌。然后第2,4,6,...,100张牌就会变成正面朝上。

接下来,你从第3张牌开始,隔2张牌翻牌(原本背面朝上的,翻转成正面朝上;原本正面朝上的,翻转成背面朝上)。再接下来,另一个人从第四张牌开始,隔3张牌翻牌(见下图)。

像这样,从第n张牌开始,每隔n-1张牌翻牌,直到没有可翻动的牌为止。(《程序员的算法趣题》P11)

image.png

问题

求当所有牌不再变动时,所有背面朝上的牌的数字。

思路

根据问题描述,按顺序对牌进行翻转处理即可。我们用数组来保存是否正面朝上的状态,分别用0,1表示,即背面朝上为0,正面朝上为1。因此第一步初始化数组,即生成一个长度为100,元素都为0的数组:

s = [0] * 100

假设初始状态所有牌都是背面朝上表示  i=0 的初始状态

从第2张开始翻牌,即第一轮翻牌表示为 i=1 状态,在这一轮里,第2、4、6...100张牌会被翻转过来,按照python里数组的索引来表示,即j = 1、3、5、...、99位上的牌将会被翻转,即满足 (j+1) % (1+1)==0

当i=2,则从第3张开始翻牌,在这一轮里,索引号j = 2、5、8、...、98位上的牌会被翻转过来,即满足 (j+1) % (2+1)==0。

当i=3,则从第4张开始翻牌,在这一轮里,索引号j = 3、7、11、...、99位上的牌会被翻转过来,即满足 (j+1) % (3+1)==0。

image.png

即对于第i轮翻牌时,满足 (j+1)%(i+1)==0 的 j 位置上的牌将会翻转,翻转的含义:

当s[j]=0时,s[j]将会变成1;当s[j]=1时,s[j]将会变成0;

当所有牌不再变动时,所有背面朝上的牌即满足s[j]==0,牌上的数字即为 j+1。

python实现

image.png

因此,答案就是1,4,9,16,25,36,49,64,81,100

更多深入思考,你可以试试。

推荐 2
本文由 _缘君_ 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册