java写扑克上下等分插入洗牌

来源:互联网 发布:浙江师范大学行知学院 编辑:程序博客网 时间:2024/05/01 06:09

原题为:用java写出算法:54张扑克,分成上下两等份洗牌,每次洗牌下面第一张都是相同的(未洗牌起始时的第一张),并且洗牌时都是依次插入一张,问洗多少次可以返回初始值。


其实刚开始看的时候是无法理解题目意思的,看了下面一个回答者(Tim Chen)举了个例子,这个洗牌规则是:

先用简单的8张牌来看,把牌标记为1 2 3 4 5 6 7 8洗牌后变成1 5 2 6 3 7 4 8

这样就好理解了。

我的想法是这样的:java嘛,就强行让他面向对象。(哈哈,这里我的类名和方法名用了中文拼音,勿喷)

建一个扑克类,然后有牌(就是张数和数组),再给他加个洗牌的函数。
方便我们观察,再给他加一个toString方法。
下面扑克类的代码。

<span style="font-family:Helvetica Neue, Helvetica, Arial, sans-serif;color:#222222;">public class PuKe{int totalCard ;int poker[];public PuKe(int totalCard){this.totalCard = totalCard;this.poker = new int[totalCard];reset();}        public void reset(){for(int i =0;i<totalCard;i++){poker[i] = i ; }}public void xiPai(){int halfCard = totalCard/2;int temArr[] = new int[totalCard];for(int i = 0; i<totalCard;i++){if(i%2==0){temArr[i]= poker[i/2];}else{temArr[i] = poker[halfCard+i/2];}}poker = temArr;}public String toString() {return "TestPoker [totalCard="+ totalCard+ ", poker="+ (poker != null ? arrayToString(poker, poker.length): null) + "]";}private String arrayToString(Object array, int len) {StringBuffer buffer = new StringBuffer();buffer.append("[");for (int i = 0; i < len; i++) {if (i > 0)buffer.append(", ");if (array instanceof int[])buffer.append(((int[]) array)[i]);}buffer.append("]");return buffer.toString();}}</span>


然后在主函数里面调用就好了,代码这样
public class MainClass {public static void main(String[] args) {PuKe puKe = new PuKe(54);int[] pokerCompare = puKe.poker;int count=0;while(!Arrays.equals(pokerCompare,puKe.poker) || count==0){System.out.println(puKe.toString());puKe.xiPai();count++;}System.out.println("这个是第"+count+"洗牌,整副牌为"+puKe.toString());}}

最后输出结果是52次。感觉没有任何算法可言。。算是一道初级题目吧

链接:https://www.zhihu.com/question/50368047/answer/120779895
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

0 0
原创粉丝点击