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

  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/keedor/p/4474497.html
Copyright © 2011-2022 走看看