剑指 Offer 61. 扑克牌中的顺子 --思路和心得

在这里插入图片描述

class Solution {
    /*
    思路:用一个参数special来代表相差的值
          就比如 1 2 5
          2和5相差两个数字,就将 special-=2; (在进行此步运算的时候要时刻注意让当前数的前一个数不为0)
          如果遇到一个零,就让special++
          最后如果special不是负数 ,返回true

    但要注意两个情况:1.重复的数字直接返回false
                      2.要先排序
                            
    */
    public boolean isStraight(int[] nums) {
    //记录差值
    int special=0;

    //对数组进行排序
    Arrays.sort(nums);

    //i=0情况
    if(nums[0]==0)special++;
    //遍历
    for(int i=1;i<5;i++){
    
      //排除重复情况
      if(nums[i]==nums[i-1]&&nums[i]!=0)return false;
      
      //如果当前数为0
      if(nums[i]==0)special++;
      
       //如果当前数不为0,且之前的数不为0
      else if(nums[i]>0&&nums[i-1]!=0) special-=(nums[i]-nums[i-1]-1);
      
    }
 
    if(special<0)return false;   
    else return true;

    }
}

另外一个思路:最大值减去最小值

class Solution {
    /*
    思路:对于此题我们只需要计算排序后的差值即可,如果差值大于6,返回false
    注意考虑重复
     */
    public boolean isStraight(int[] nums) {

    //排序
    Arrays.sort(nums);
    
    //差值参数
    int special=0;
    
    //对初始值进行判断
    if(nums[0]!=0)special=nums[4]-nums[0];
    //遍历
    for(int i=1;i<5;i++){
    
    if(nums[i]!=0) {
   //重复的情况
   if(nums[i]==nums[i-1])return false;
   //计算最大值和最小值的差值
    if(special==0)  special=nums[4]-nums[i];
    }

    }
 
    //如果差值大于6,返回false
    if(special>4)return false;

    //默认返回true
    return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值