面试题61:扑克牌的顺序
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。
思路1:
- 建立一个新的数组,存储大小王换算成其他牌之后的卡牌结果
代码实现:
package Question61;
import java.util.Arrays;
public class T01 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,6};
System.out.println(solve(arr));
}
public static boolean solve(int[] nums) {
if(nums == null || nums.length == 0) return false;
Arrays.sort(nums);
int[] finalCard = new int[nums.length];
int index = 0;
int count = 0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] == 0) count++;
else {
//说明是第一张牌,这张牌直接存入finalCard数组中
if(i == count) finalCard[index++] = nums[i];
else {
if(nums[i] - finalCard[index-1] != 1) {
if(count <= 0) return false;
else {
finalCard[index] = finalCard[(index++)-1]+1;
count--;
//因为之后要重新对这张牌进行检查,所以i--
i--;
}
}
else finalCard[index++] = nums[i];
}
}
}
return true;
}
}
思路2:
- 把数组排好序之后,除0之外,数每两张卡牌之间的差
- 如果差为1,则不计算
- 如果差大于1,则计算gap-1的值
- 所有的差值最后和0的个数进行比较,如果不等,则返回false,否则返回true
代码实现:
package Question61;
import java.util.Arrays;
public class T02 {
public static void main(String[] args) {
int[] arr = {6, 2, 3, 0, 0};
System.out.println(solve(arr));
}
public static boolean solve(int[] nums) {
if(nums == null || nums.length == 0) return false;
Arrays.sort(nums);
int count = 0;
int gap = 0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] == 0) count++;
else if(i - count > 0){
if(nums[i] - nums[i-1] < 1) return false;
gap += nums[i] - nums[i-1] - 1;
}
}
return gap <= count;
}
}