劍指offer——(18)撲克牌順子
阿新 • • 發佈:2018-12-03
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; } }