剑指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++;

   

然后从第一个不为0index1开始,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);

posted @ 2015-05-03 19:11  keedor  阅读(710)  评论(0编辑  收藏  举报