剑指Offer解题报告(Java版)——扑克牌顺子 44
分析问题
这个题目的关键点在于大小王可以看作任意的数字,那么我们就把这个任意的数字看作0也未尝不可,因为扑克牌中1-15都有数字,所以可以用0代表大小王
这样我们就将问题转换成了从0-15中抽5个数字,看是否连续的问题,由于0可以看作任意数字,所以我们可以用0去补那些空缺的数,比如0,1,3也算是连续的
要记住关键点还是这个任意数字上,考虑一个问题,就是如果这5个数中0的个数大于等于空缺数,那么坑一定能补上,所以一定是连续的,如果0的个数小于空缺数,那么0的个数不够补上所有的坑,所以就是不连续的
这样问题又转换为看一个排序数组中0多还是间隔的数字多的问题,看,问题都是不停的在转换,而且一步一步抽丝剥茧最后答案慢慢浮出水面的
解决问题
首先我们先对抽出的5个数进行排序,Arrays.sort(array);然后遍历数组统计数组中0的个数,另外这里如果找到两个零,其实没有必要再继续下去,可以跳出循环
for(int i=0;i<array.length;i++){
if(array[i]==0) numOf0++;
if(numOf0==2) break;
}
另外可以把if判断语句放在for循环中,这样可以进入循环体的次数,减少遍历次数
for(int i=0;i<array.length&&(array[i]==0)&&(numOf0!=2);i++) numOf0++;
然后从第一个不为0的index1开始,int index1=numOf0;比较相邻两个之间index1和index2=index1+1的差距
while (index2<array.length) {
//如果有两个一样的,那说明一定不是连续的
if (array[index1]==array[index2]) {
return false;
}
numOfDif+=array[index2]-array[index1]-1;
//实现两个相邻的比较往后面移动
index1=index2;
index2++;
}
最后比较0的个数和坑的个数return (numOf0>numOfDif?true:false);