题目
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
代码实现
基于快排的解法
class Solution {
public boolean isStraight(int[] nums) {
quickSort(nums,0,nums.length-1);
//n表示当前有多少张任意牌
int n = 0;
for (int i = 0; i < nums.length - 1; i++) {
if(nums[i] == 0){
n++;
}
else if(nums[i] == nums[i+1]){
return false;
}
//此时消耗的任意牌数量就是点数差-1
else if (nums[i] + 1 != nums[i+1]){
n-=nums[i+1] - nums[i] -1;
}
}
return n>=0;
}
/**
* 开始的索引和结束的索引
* 快排范围是左闭右闭
* @param nums
* @param begin
* @param end
* @return
*/
public void quickSort(int[] nums,int begin,int end){
if(begin < end){
int par = partition(nums,begin,end);
quickSort(nums,begin,par-1);
quickSort(nums,par + 1,end);
}
}
/**
* 函数调用结束后,left的左边 全是小于等于nums[left]的元素,右边全是大于nums[left]的元素
* @param nums
* @param left
* @param right
* @return
*/
public int partition(int[] nums,int left,int right){
int temp = nums[right];
int i = right;
while (left < right){
if(nums[left] > temp){
right--;
swap(nums,left,right);
}else if(nums[left] == temp){
left++;
}else {//nums[left] < temp
left++;
}
}
swap(nums,i,left);
return left;
}
public void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
使用系统自带的sort
class Solution {
public boolean isStraight(int[] nums) {
Arrays.sort(nums);
//第一个不为0的数
int index = 0;
int max = nums[nums.length-1];
for (int i = 0; i < nums.length-1; i++) {
if(nums[i] == 0){
index++;
continue;
}
if(nums[i] == nums[i+1]){
return false;
}
}
return max - nums[index] < 5;
}
}