1. 程式人生 > >劍指offer——(18)撲克牌順子

劍指offer——(18)撲克牌順子

import java.util.Arrays;
public class Solution {
    public boolean isContinuous(int [] numbers) {
        // 陣列為空的情況
        if(numbers.length==0) return false;
        int count = 0, temp = 0, countKing = 0, first = 0;
        boolean boo = true;
        // 排序 代表大王的是0 
        Arrays.sort(numbers);
        for(int i=0;i<numbers.length;i++){
            // 計算大王的數量用countKing儲存
            if(numbers[i]==0){
                countKing++;   
                count++; // 計算順子的張數
                first = i; // mark下最後一張大王的位置
                continue;
            }
            else {
                /*
                 * 陣列中最大值減去非0最小值-1大於陣列長度減去這兩個數 夠不成順子 
                 * 測試資料:0 1 3 0 7
                 * 排完序 0 0 1 3 7
                 * 需要2 4 5 6四個數才能構成順子(六位順子) 不可能
                */
                /*
                 * 非零數字有重複 夠不成順子 測試資料:0 0 0 1 1 
                */
                if((numbers[numbers.length-1]-numbers[first+1]-1>numbers.length-2)
                    ||((numbers[numbers.length-1]-numbers[first+1]==0)&&(first+1!=numbers.length-1))) break;
                /*
                 * 沒有大王的時候 
                 * 測試資料:3 2 1 4 5 
                */
                if(boo==true){
                    temp = numbers[i];
                    count++;
                    boo = false;
                    continue;
                }
                temp += 1;
                if(numbers[i]==temp) count++; 
                /*
                 * 使用大王可以代替任何牌的屬性
                 * 測試資料:0 0 1 3 4
                */
                if(numbers[i]!=temp&&countKing>0){
                    count++;
                    countKing--;
                }
            }
        }
        //System.out.println(count);
        return count==numbers.length?true:false;
    }
}