扑克牌有两个属性,花色和牌面大小,可以分别比较花色和牌面大小是否递增或递减来确定是不是同花顺.但是由于扑克牌会有JQKA,所以牌面大小最好以数组或者字符串的方式实现,通过比较下标来比较大小,以下是大概的代码
public class PuKe {private String color
private String num
public String getColor() {
return color
}
public void setColor(String color) {
this.color = color
}
public String getNum() {
return num
}
public void setNum(String num) {
this.num = num
}
public PuKe(String color, String num) {
super()
this.color = color
this.num = num
}
public static void main(String[] args) {
List<PuKe>card = new ArrayList<PuKe>()
card.add(new PuKe("black", "2"))
card.add(new PuKe("black", "3"))
card.add(new PuKe("black", "4"))
card.add(new PuKe("black", "5"))
card.add(new PuKe("black", "6"))
//这里因为10是两位数且牌面里面用不到1,所以直接用1代替10
String check = "234567891JQKA"
boolean flage =true
//自定义比较器,用num在check里的下标大小作为比较依据排序
Collections.sort(card, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
PuKe er1 = (PuKe) o1
PuKe er2 = (PuKe) o2
Integer org1 = (int)(er1.getNum() == null ? 0.0 : check.indexOf(er1.getNum()))
Integer org2 = (int)(er1.getNum() == null ? 0.0 : check.indexOf(er2.getNum()))
return org1.compareTo(org2)
}
})
for (int i = 0 i < card.size()-1 i++) {
//遍历所有的牌,如果颜色不一样直接跳出循环,不是同花顺
if(!card.get(i).getColor().equals(card.get(i+1).getColor())){
flage =false
break
}
//如果上一张减去下一张的差值不是1,说明牌面不是顺子,也不是同花顺,跳出循环
if((int)check.indexOf(card.get(i+1).getNum())-(int)check.indexOf(card.get(i).getNum())!=1){
flage = false
break
}
}
if(flage){
System.out.println("牌面是同花顺")
}else{
System.out.println("牌面不是同花顺")
}
}
}
不过这种方法唯一不好的地方是check中不能直接用10,将来展示的时候需要判定,展示的是1时直接改成10.
其实实现方法很多,我这么写是因为最近在复习,这么写用到的知识点相对会多一点.
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
示例 1:
示例 2:
限制:
如果没有重复的牌:
方法一:set去重
方法二:排序后遍历
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
示例 1:
输入: [1,2,3,4,5]
输出: True
示例 2:
输入: [0,0,1,2,5]
输出: True
限制:
数组长度为 5
数组的数取值为 [0, 13] .
如果要构成是顺子的情况,那么必然需要连起来,比如像下图中的 1,2,3,4,5.
有一个大小王,也就是有一个数字 0,对于我们举的例子1,2,3,4,5,中有一个数字被 0进行替换了。
如果想要构成顺子,那么必须是1,2,3,4,5中的任意一个被0替换了,因为想要0可以变成任意的一个数字
上述5种情况,都是可以构成顺子的情况。
总共有上述10种情况,观察这10种情况知道:
从上面的流程中可以知道本题的算法思路: