Java- 教你简单玩扑克
*/
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 个分享的大知识点)
评论