面試題 44: 撲克牌的順子

一. 題目

從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的.大小王可看做任意數字.

代碼請到我的代碼庫中下載 Point2Offer

二. 代碼

package week_4;

/**難度係數:***
 * 劍指offer: 撲克牌的順子
 * 方法: 排序,計算大小王的個數,注意有對子,肯定不是順子
 * 測試用例:功能測試(不含王是順子,含王是順子,全是王或四個王,含有對子,不是順子,含王不是順子,空數組)
 * @author dingding
 * Date:2017-7-7 20:10
 * Declaration: All Rights Reserved!
 */
public class No44 {

    public static void main(String[] args) {
        test1();
        test2();
        test3();
        test4();
        test5();
        test6();
        test7();
    }
    //solution
    private static boolean isContinuous(int[] numbers){
        if (numbers == null || numbers.length < 1) {
            return false;
        }
        //排序
        hashSort(numbers);
        int numberOf0 = 0;
        int numberOfGap = 0;

        //統計數組中0的個數
        for (int i=0;i<numbers.length;i++){
            if (numbers[i] == 0) {
                numberOf0++;
            }
        }

        //統計數組中間隔的個數
        for (int j=0;j<numbers.length;j++){
            if (j<4 && numbers[j]!=0 && numbers[j] == numbers[j+1]) {
                return false;
            }
            if (j<4 && numbers[j+1]-numbers[j] !=0 && numbers[j+1]-numbers[j] !=1 && numbers[j]!=0) {
                numberOfGap +=numbers[j+1] -numbers[j]-1;
            }
        }
        return (numberOfGap>numberOf0) ? false :true;
    }

    //藉助輔助空間進行排序
    private static void hashSort(int[] numbers) {
        if (numbers == null || numbers.length < 1) {
            return;
        }
        int maxNumber = 13;
        int[] timesOfNumber = new int[maxNumber+1];

        for (int i=0;i<=maxNumber;++i)  //所有牌都列出來
            timesOfNumber[i] = 0;
        for (int j=0;j<numbers.length;++j){ //遍歷數組
            int number = numbers[j];
            if (number<0 || number>13) {
                break;
            }
            ++ timesOfNumber[number];
        }
        int index = 0;
        for (int i=0;i<=maxNumber;++i){
            for (int j=0;j<timesOfNumber[i];++j){
                numbers[index] = i;
                index ++;
            }
        }
    }
    /*=================測試用例====================*/
    private static void test1() {
        int[] a ={1,3,0,4,5};
        if(isContinuous(a)){
            System.out.println("YES!");
        }else {
            System.out.println("No!");
        }
    }

    private static void test2() {
        int[] a ={2,3,1,4,5};
        if(isContinuous(a)){
            System.out.println("YES!");
        }else {
            System.out.println("No!");
        }       
    }

    private static void test3() {
        int[] a ={0,0,7,0,0};
        if(isContinuous(a)){
            System.out.println("YES!");
        }else {
            System.out.println("No!");
        }       
    }

    private static void test4() {
        int[] a ={0,0,0,0,0};
        if(isContinuous(a)){
            System.out.println("YES!");
        }else {
            System.out.println("No!");
        }   
    }

    private static void test5() {
        int[] a ={0,1,3,0,6};
        if(isContinuous(a)){
            System.out.println("YES!");
        }else {
            System.out.println("No!");
        }           
    }

    private static void test6() {
        int[] a ={0,1,6,0,1};
        if(isContinuous(a)){
            System.out.println("YES!");
        }else {
            System.out.println("No!");
        }           
    }

    private static void test7() {
        int[] a ={};
        if(isContinuous(a)){
            System.out.println("YES!");
        }else {
            System.out.println("No!");
        }   
    }

}



有不妥當之處,麻煩告知:D

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章