剑指offer第二版-61.扑克牌中的顺子

本系列导航:剑指offer(第二版)java实现导航帖

面试题61:扑克牌中的顺子

题目要求:
抽取5张牌,判断是不是一个顺子。2-10为数字本身,A为1,J为11,Q为12,K为13,大小王可堪称任意数字。

解题思路:
将1-10,J,Q,K记作1-13,大小王记作0,0可以转化为任意的1-13的数字,判断输入的5个数字是否能组成连续的5个数字即可。

package chapter6;

/**
 * Created with IntelliJ IDEA
 * Author: ryder
 * Date  : 2017/8/20
 * Time  : 14:59
 * Description:扑克牌中的顺子
 **/
public class P298_ContinousCards {
    public static boolean isContinous(int[] data){
        if(data==null || data.length!=5)
            return false;
        int[] table = new int[14];
        for(int i=0;i<data.length;i++){
            if(data[i]>13||data[i]<0)
                return false;
            table[data[i]]++;
        }
        int start = 1;
        while (table[start]==0)
            start++;
        int king = table[0];
        for(int i=start;i<start+5;i++){
            if(i>13)
                break;
            if(table[i]>1||table[i]<0)
                return false;
            else if(table[i]==0){
                if(king==0)
                    return false;
                else
                    king--;
            }
        }
        return true;
    }
    public static void main(String[] args){
        int[] data1 = new int[]{4,2,7,12,1}; //false
        int[] data2 = new int[]{0,5,6,12,0}; //false
        int[] data3 = new int[]{6,5,8,7,4};  //true
        int[] data4 = new int[]{0,5,6,9,8};  //true
        int[] data5 = new int[]{0,13,0,12,0}; //true
        System.out.println(isContinous(data1));
        System.out.println(isContinous(data2));
        System.out.println(isContinous(data3));
        System.out.println(isContinous(data4));
        System.out.println(isContinous(data5));
    }
}

运行结果

false
false
true
true
true

推荐阅读更多精彩内容