扑克牌中的顺子问题

来源:互联网 发布:yy老虎机软件 编辑:程序博客网 时间:2024/05/17 10:38

输入:数组元素为0~13的数组; 0表示大王小王;1-13表示A-K

数组长度为5;问这五数是否可以组成顺子

输出:能组成顺子返回true,否则返回false


思路1:1 先排序,标记0的个数,

2 从不为0的数开始遍历,如果当前数为1且与后一个数的差大于等于9,继续循环(考虑10 JQKA)。前一个数与后一个数差:为0返回false(考虑重复不为0的数);小于等于0的个数+1,0的个数减去这个差-1,循环继续遍历。 


boolean isContinuous(int[] numbers) {if(numbers.length<5)return false;Arrays.sort(numbers);int zeroCount = 0;for(int i = 0;i < numbers.length && numbers[i]==0;i++){zeroCount++;}int j = zeroCount;while(j+1<numbers.length){if(numbers[j]==numbers[j+1])return false;else if(numbers[j]==1 &&numbers[j+1]-numbers[j]>=9){j++;}else if(zeroCount>=numbers[j+1]-numbers[j]-1){zeroCount -= numbers[j+1]-numbers[j]-1;j++;}elsereturn false;}return true;}

思路2:

max 记录 最大值min 记录  最小值min ,max 都不记0满足条件

 1  除0外没有重复的数字(牌) 用长度为14的数组 

2  max - min <5      


public boolean isContinuous(int [] numbers) { int[]d = new int[14];  d[0] = -5;  int len = numbers.length;  int max = -1;  int min = 14;  for(int i =0;i<len;i++){    d[numbers[i]]++;      if(numbers[i] == 0){         continue;      }     if(d[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; }



  思路3:

1. 除0外没有重复的数(利用bit的与或关系去重)
2. max - min < 5
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++) {            int number = numbers[i];            if(number < 0 || number > 13) return false;            if(number == 0) continue;            if(((flag >> number) & 1) == 1) return false;            flag |= (1 << number);            if(number > max) max = number;            if(number < min) min = number;            if(max - min >= 5) return false;        }        return true;    }}


     

0 0
原创粉丝点击