原题链接
描述
现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
现在有2副扑克牌,从扑克牌中随机五张扑克牌,我们需要来判断一下是不是顺子。
有如下规则:
- A为1,J为11,Q为12,K为13,A不能视为14
- 大、小王为 0,0可以看作任意牌
- 如果给出的五张牌能组成顺子(即这五张牌是连续的)就输出true,否则就输出false。
示例
输入:[6,0,2,0,4]
返回值:true
思路一
快排,统计出 0 的个数。然后从数组中 0 以后的元素检测最大点数差是不是大于等于5,如果是,那就不可能组成顺子,ret false;如果不是,检测是不是有相同的值,如果是,ret false;都不是的话,ret true。
解答
public class Solution {
public void qSort(int[] arr, int low, int high) {
if (low > high) return;
int i = low, j = high, tmp = arr[low];
while (i < j) {
while (i < j && arr[j] >= tmp) j--;
while (i < j && arr[i] <= tmp) i++;
if (i < j) {
int a = arr[i];
arr[i] = arr[j];
arr[j] = a;
}
}
arr[low] = arr[i];
arr[i] = tmp;
qSort(arr, low, i - 1);
qSort(arr, i + 1, high);
}
public boolean IsContinuous(int[] numbers) {
qSort(numbers, 0, numbers.length - 1);
int len = numbers.length;
int sum = 0;//统计0的个数
// 有n个零,牌的点数的最大差就是n
for (int a : numbers) {
if (a != 0) break;
else ++sum;
}
if (numbers[len - 1] - numbers[sum] >= 5) return false;
for (int i = sum; i < len - 1; i++) {
if (numbers[i] == numbers[i + 1]) return false;
}
return true;
}
}
精简
// 同样的思路,大佬的代码很简洁
import java.util.Arrays;
public class Solution {
public boolean IsContinuous(int[] numbers) {
Arrays.sort(numbers);
int cnt = 0;//统计0的个数
for (int i = 0; i < 4; i++) {
if (numbers[i] == 0) cnt++;
else if (numbers[i] == numbers[i + 1]) return false;
}
return numbers[4] - numbers[cnt] <5;
}
}
思路二
主要就是判重以及确定最大值最小值差是不是小于5。判重可以通过 HashSet 来实现,在判重的过程中如果重复ret false,并且随时更新最大值、最小值,最后判断 max 和 min 的差。时间复杂度是 O(n),低于思路一O(nlogn),不过数组长度规定是5,所以区别不大。