码迷,mamicode.com
首页 > 编程语言 > 详细

剑指Offer解题报告(Java版)——扑克牌顺子 44

时间:2015-05-03 20:19:41      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

? ?

分析问题

? ?

这个题目的关键点在于大小王可以看作任意的数字,那么我们就把这个任意的数字看作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);

剑指Offer解题报告(Java版)——扑克牌顺子 44

标签:

原文地址:http://www.cnblogs.com/keedor/p/4474497.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!