题目:
给定5个数,判断是否是连续数字,其中0可以替代任意数。
方法一:
暴力方法就是对数组进行排序后遍历,记录0的个数判断连续。
方法二:
因为数组个数是固定的,那么若数组连续,则数组中最大数-最小数应等于4,但此处额外有0代替任意数的存在,那么最大数-最小数还可以小于4。
例如1 2 3 0 0,最大数-最小数只要小于4,剩余部分可以由0补充。
public boolean isStraight1(int[] nums) {
Set<Integer> num = new HashSet<>();
int min = 14;
int max = 0;
for (int i : nums) {
if (i == 0) {
continue;
}
if (num.contains(i)) {
return false;
}
max = Math.max(max, i);
min = Math.min(min, i);
num.add(i);
}
return max - min < 5;
}
注:数组出现重复就不可能连续,该方法数组中为乱序,用Set可以判断重复。
方法三:
在数组排序后,可以省去方法二中对最大数、最小数的获取,在排序数组中,前面都是0,0后即为最小数,数组最后一个即为最大数。
public boolean isStraight(int[] nums) {
int joker = 0;
Arrays.sort(nums);
for (int i = 0; i < 4; i++) {
if (nums[i] == 0) {
joker++;
continue;
}
if (nums[i] == nums[i - 1]) {
return false;
}
}
return nums[4] - nums[joker] < 5;
}
注:排序后的数组判断重复只用判断该位数与后一位数不相同即可。