分享

【算法趣题】 Q03 翻牌

 长沙7喜 2018-02-04

作者:简单的happy    天善智能社区专栏作者

博客地址:https://www./u/jasmine3happy/articles


前文传送门:

【算法趣题】Q01 回文十进制数

【算法趣题】Q02 数列的四则运算


问题描述


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


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


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



问题


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


思路


根据问题描述,按顺序对牌进行翻转处理即可。我们用数组来保存是否正面朝上的状态,分别用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。




即对于第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实现




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


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

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多