一、题目
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子, 即这5张牌是不是连续的。2~10为数字本身, A为1。 J为11、Q为12、 为13。小王可以看成任意数字。
二、举例
题目:比如题目的顺序是{2,1,3,4,5}那么其输出结果是true,如果输入的数组是{0,5,6,1,7}那么其输出结果是false
三、思想
(1)对数组进行排序
(2)统计数组中0元素的个数
(3)排序后0肯定是在最前面的,所以可以找到数组中除0外最小的数字data[small]
(4)将data[big]和data[small]相减,最终得到相邻非零元素之间的差值
(5)将差值和0元素的个数相比较,最终就可以判断是true还是false了
四、程序
package 剑指offer;
import java.util.Arrays;
/*题目:从扑克牌中随机抽5张牌,判断是不是一个顺子, 即这5张牌是不是连续的。2~10为数字本身,
*A为1。 J为11、Q为12、 为13。小王可以看成任意数字。*/
public class Test46 {
public static boolean isContinue(int []data){
// 用来存储数字之间的间隔数,便于后边的比较
int numberOfGap = 0;
// 边界条件的判断
if(data == null || data.length < 5){
return false;
}
// 先将5个数进行排序
Arrays.sort(data);
// 统计5个数中零元素的个数
int numberZero = 0;
for(int i = 0; i < 5; i++){
if(data[i] == 0){
numberZero++;
}
}
// 因为是排序之后的了,所以是第一个非零元素的位置
int small = numberZero;
int big = small + 1;
while(big < data.length){
if(data[small] == data[big]){
return false;
}
numberOfGap += (data[big] - data[small] - 1);
small = big;
big++;
}
return numberOfGap <= numberZero;
}
public static void main(String args[]){
int[] numbers1 = {1, 3, 2, 5, 4};
System.out.println(isContinue(numbers1));
int[] numbers2 = {1, 3, 2, 6, 4};
System.out.println(isContinue(numbers2));
int[] numbers3 = {0, 3, 2, 6, 4};
System.out.println(isContinue(numbers3));
int[] numbers4 = {0, 3, 1, 6, 4};
System.out.println(isContinue(numbers4));
}
}
开始的时候忘掉了排序之后0就在最前面了