zoukankan      html  css  js  c++  java
  • 剑指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);

  • 相关阅读:
    计算相邻字段 四至
    eclipse+terminal
    10 行 Python 代码实现模糊查询/智能提示
    Sublime Text 3,有了Anaconda就会如虎添翼
    Visual Studio上开发Python六大功能
    11 Python Libraries You Might Not Know
    linux安装PyCharm,PyCharm常用快捷键及调试模式,pycharm里面对文件夹或者文件进行重命名
    mysql mac客户端: sequel,mysql-workbench
    ImageMagick convert多张照片JPG转成pdf格式,pdfunite合并PDF文件
    互联网金融ABS为何遭遇急刹车?
  • 原文地址:https://www.cnblogs.com/keedor/p/4474497.html
Copyright © 2011-2022 走看看