写点什么

Java- 教你简单玩扑克

  • 2022 年 4 月 14 日
  • 本文字数:2027 字

    阅读完需:约 7 分钟

*/


for (int i = list.size()-1; i > 0 ; i--) {


int index = random.nextInt(i);//产生随机数[0,51)


swap(list,index,i);


}


}


我们来看看效果



很明显可以看出牌的顺序已经发生了变化,而且是没有规律的,那说明我们洗牌成功


3.3 这里要特别注意洗牌中的交换操作——swap()操作


/**


*这里有一个犯错的点,我们以前在发生两个数值交换的时候总是定义一个临时变量


  • 如交换整型的 a 和 b {int x = a,a = b,b = x};

  • 而在这里是面向对象,是方法,使用我们应该调用方法来实现交换操作

  • 也就是使用 list 中的 set 方法,


*/


private static void swap(List<Card> list,int index,int i){


Card tmp = list.get(index);//先保存 index 下标所对应的值


list.set(index,list.get(i));//然后使用 set 方法将 index 位置的值修改为 i 下标的值


list.set(i,tmp);//然后将 i 下标的值修改为保存在 index 位置的值也即 tmp


}


4.已经完成买完牌和洗牌操作,那我们就来发牌


方法说明:现在有三个人,每个人将会得到五张牌(当然具体几张根据需要决定,这里只是简单说明),三个人将会按照顺序一次从牌堆顶揭牌,直至每个人手上揭够五张


具体实现:我们现在将洗好的牌放在 list 当中,那第一个就是从 0


号位置揭牌,然后我们将 0 号位置的牌删除,那么剩下的牌的堆顶元素的下别又变成了 0 号下标,那么下一个人也将会从 0 号下标揭牌,一次类推,每个人都是从 0 号下标拿牌,具体看代码


如图所示



揭牌代码


/**


  • 揭牌操作

  • hands1 hands2 hands3 分别代表三个人,然后每个人揭的牌将会放入他们里面

  • 我们将三个人揭的牌放在 lists 中


*/


List<List<Card>> lists = new ArrayList<>();


List<Card> hands1 = new ArrayList<>();


List<Card> hands2 = new ArrayList<>();


List<Card> hands3 = new ArrayList<>();


lists.add(hands1);


lists.add(hands2);


lists.add(hands3);


for (int i = 0; i < 5; i++) { //每个人揭五张牌


for (int j = 0; j < 3; j++) { //一共有三个人


lists.get(j).add(ret.remove(0));


}


}


System.out.println("============== 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 =============");


System.out.println("第一个人揭的牌");


System.out.println(lists.get(0));


System.out.println("第二个人揭的牌");


System.out.println(lists.get(1));


System.out.println("第三个人揭的牌");


System.out.println(lists.get(2));


System.out.println("剩下的牌"+"\n"+ret);


效果



完整代码


import java.util.ArrayList;


import java.util.List;


import java.util.Random;


class Card{


public String suit;//花色,花色有【"?","?","?","?"】


public int rank;//牌的数值,【1-13】


//并提供其构造方法


public Card(String suit, int rank) {


this.suit = suit;


this.rank = rank;


}


@Override


public String toString() {


return String.format("%s %d",suit,rank);


}


}


//牌 52:1 2 Java 开源项目【ali1024.coding.net/public/P7/Java/git】 3 4 5 6 7 8 9 10 11 12 13


//花色:"?","?","?","?"


public class TestDemo4 {


public static final String[] suits = {"?","?","?","?"};//定义牌的花色,因为花色是不变额


public static List<Card> buyCard(){


List<Card> list = new ArrayList<>();//存放牌,买的牌存放在 list


for (int i = 0; i < 4; i++) {


for (int j = 1; j <= 13; j++) {


String suit = suits[i];//0->?,1->?,2->?,3->?


int rank = j;//1-13


Card card = new Card(suit,rank);


list.add(card);//将买的牌放在 list 当中


}


}


return list;


}


/**


*这里有一个犯错的点,我们以前在发生两个数值交换的时候总是定义一个临时变量


  • 如交换整型的 a 和 b {int x = a,a = b,b = x};

  • 而在这里是面向对象,是方法,使用我们应该调用方法来实现交换操作

  • 也就是使用 list 中的 set 方法,


*/


private static void swap(List<Card> list,int index,int i){


Card tmp = list.get(index);//先保存 index 下标所对应的值


list.set(index,list.get(i));//然后使用 set 方法将 index 位置的值修改为 i 下标的值

总结

三个工作日收到了 offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。


  • 第一个是算法


关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。


而且,我貌似是将《算法刷题 LeetCode 中文版》、《算法的乐趣》大概都过了一遍,尤其是这本


《算法刷题 LeetCode 中文版》总共有 15 个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题



《算法的乐趣》共有 23 个章节:




  • 第二个是 Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)


基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)



  • 第三个是网络(给大家看一本我之前得到的《JAVA 核心知识整理》包括 30 个章节分类,这本 283 页的 JAVA 核心知识整理还是很不错的,一次性总结了 30 个分享的大知识点)



用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Java-教你简单玩扑克_Java_爱好编程进阶_InfoQ写作平台