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);

  • 相关阅读:
    【线段树合并】联通分量计数
    莫队算法
    Ubuntu实用软件安装[转]
    装系统·折腾记
    Qt环境配置 + Qt使用教程
    Google题解
    隐含马尔科夫模型
    Pythonの坑
    C++11并发编程个人小结
    微软2017年预科生计划在线编程笔试
  • 原文地址:https://www.cnblogs.com/keedor/p/4474497.html
Copyright © 2011-2022 走看看