文章目录
  1. 1. 题目
  2. 2. 解题
  3. 3. 代码

题目

从52张牌中随意取5张,看是否能组成顺子
其中1~k 表示1~13  大小王可以代替任意数字

解题

首先可以将牌映射到数组上,然后将数组排序
在使用左右两端的指针向中间靠
如果左指针与接下来的值相差1或者接下来的值时大小王 则过到下一个
否则判断右指针是否有大小王 有的话右指针左移一位

现在有牌排序之后的样纸
1245,king
^           ^
第一次判断的时候可以发现1=2-1  正好成顺序
1245,king
   ^        ^
但是在第二次迭代中会发现这次2!=4-1
所以要去判断最后面是否存在q,如果存在,这右指针前面移动
1245,king
   ^    ^

然后这里不断迭代即可,直到左右指针碰到一起

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* 先排序
* 在使用左右两端的指针向中间靠
* 如果左指针与接下来的值相差1或者接下来的值时大小王 则过到下一个
* 否则判断右指针是否有大小王 有的话右指针左移一位
* @param a
* @return
*/

public static boolean cardStraight(int[] a)
{

Arrays.sort(a);//进行排序 O(nlogn)
int i=0,j=a.length-1;

boolean flag=true;
int cur=a[i];//表示当前比较的牌 不是前后两张牌是否是连续的或者是用大小王来代替的 这个cur的计数都会+1

while(i<j)
{
if(cur==a[i+1]-1||a[i+1]==Integer.MAX_VALUE)
{
i++;//这里表示上下两张牌连续 后者最后一张可以用的牌位大小王
}else{
if(a[j]==Integer.MAX_VALUE)//不通过 判断最后一张牌是不是大小王
{
j--;
}else{
flag=false;
break;
}
}
cur++;
}

return flag;
}

可以看一下测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
//这里使用Integer.MAX_VALUE表示大小王
int[] a={1,2,3,4,5};
System.out.println(cardStraight(a));
int[] b={1,2,3,4,3};
System.out.println(cardStraight(b));
int[] c={1,2,3,4,Integer.MAX_VALUE};//有一个大小王
System.out.println(cardStraight(c));
int[] d={1,Integer.MAX_VALUE,Integer.MAX_VALUE,4,Integer.MAX_VALUE};//有好多大小王
System.out.println(cardStraight(d));
int[] e={1,Integer.MAX_VALUE,Integer.MAX_VALUE,6,Integer.MAX_VALUE};//有好多大小王 但是最大的牌也太大了
System.out.println(cardStraight(e));
}

最终结果为:

true
false
true
true
false

本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权

文章目录
  1. 1. 题目
  2. 2. 解题
  3. 3. 代码