扑克牌顺子

扑克牌顺子_第1张图片解题思路

  1. 首先判断是否是5张牌,如果不是5张,返回false
  2. 如果想要成顺子,那么除了0号牌(大王小王)之外,其他牌不能出现重复
  3. 抽到的5张牌的最大值和最小值之间的差不能超过5

代码实现

public class Solution {
    public boolean isContinuous(int [] numbers) {
        if(numbers.length != 5){ 
            return false;
        }
        int[] counts = new int[14]; //统计0-k这13个数每个出现的个数  其中0代表大王小王
        int max = -1;
        int min = 14;
        for(int i=0;i<numbers.length;i++){
            counts[numbers[i]]++; //统计每个数出现的次数
            if(numbers[i] == 0){ 
                continue;
            }
            if(counts[numbers[i]]>1){
                return false;
            }
            if(numbers[i]>max){
                max = numbers[i];
            }
            if(numbers[i]<min){
                min = numbers[i];
            }
        }
        if(max-min<5){
            return true;
        }
        return false;
    }
}

通过这个题目引申出来的思想:

  • 如果遇到题目要求不能出现重复的值,你可以想到2种方法:

   (1) 申请一个统计每个值出现个数的数组

比如判断numbers数组里的元素是否有重复值出现
int[] counts = new int[14]; //申请数组大小为14是因为numbers数组里共有14种可能的数字0-13
for(int i=0;i<numbers.length;i++){
    if(counts[numbers[i]]>1){
       return false;
    }
 }

  (2)利用位运算的思想

 位运算的这个用的比较妙,我理解了好大一会也没太懂,但如果题目不让申请额外空间,就用得到这个了

  if(((flag >> numbers[i]) & 1) == 1){
        return false;
  }
  flag |= (1 << numbers[i]);

扑克牌顺子_第2张图片

public class Solution {
    public boolean isContinuous(int [] numbers) {
        if(numbers.length != 5){
            return false;
        }
        int min = 14;
        int max = -1;
        int flag = 0;
        for(int i=0; i < numbers.length; i++){
            if(numbers[i] ==0){
                continue;
            }
            if(((flag >> numbers[i]) & 1) == 1){
                return false;
            }
            flag |= (1 << numbers[i]);
            if(numbers[i] > max){
                max = numbers[i];
            }
            if(numbers[i] < min){
                min = numbers[i];
            }
            if(max-min >=5){
                return false;
            }
        }
        return true;
    }
}

你可能感兴趣的:(剑指offer)