LL今天心情特別好,由于他去買了1副撲克牌,發(fā)現(xiàn)里面竟然有2個大王,2個小王(1副牌本來是54張^_^)…他隨機(jī)從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!!“紅心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是順子…..LL不高興了,他想了想,決定大\小 王可以看成任何數(shù)字,并且A看做1,J為11,Q為12,K為13。上面的5張牌就能夠變成“1,2,3,4,5”(大小王分別看做2和4),“So Lucky!”。LL決定去買體育彩票啦。 現(xiàn)在,要求你使用這幅牌摹擬上面的進(jìn)程,然后告知我們LL的運(yùn)氣如何。為了方便起見,你可以認(rèn)為大小王是0。
理解題目意思
54張撲克,2個大王,2個小王,隨機(jī)抽取5張,判斷是不是是連續(xù)的5個數(shù)
說明:
1.大小王可以當(dāng)人任意的數(shù)
2.大小王是0作為標(biāo)示
3.字母理解成對數(shù)字
4.輸入的是轉(zhuǎn)換后的數(shù)
進(jìn)1步理解:
0到13內(nèi)的數(shù),每一個數(shù)有4張,共54張,其中抽取5張,判斷能否組成連續(xù)的數(shù)
說明:0可以當(dāng)作任意的數(shù)
先排序比較處理
重復(fù)數(shù)不是0,1定不可以組成連續(xù)數(shù)
沒有0,當(dāng)時連續(xù)數(shù)時候,5個數(shù)的和等于:
1個0,判斷4個數(shù)是不是是連續(xù)數(shù),是可以組成,否,判斷排序后的4個數(shù)相鄰元素是不是只有1個相鄰數(shù)對間隔2。依照下面思路,排序后4個數(shù)的
間隔是:111,211,121,112
2個0,這個比較復(fù)雜了,根據(jù)1個0的情況確切比較復(fù)雜,我們只需要判斷排序后的3個數(shù)之間的間隔是多少,11,31,13,22這4種情況加0后是連續(xù)數(shù)
3個0,排序后的兩個數(shù)間隔:1,2,3,4
4個0,1定可以組成
import java.util.*;
public class Solution {
public boolean isContinuous(int [] numbers) {
if(numbers ==null || numbers.length!=5)
return false;
Arrays.sort(numbers);
int count0 = 0;
int count1 = 0;
for(int i=0;i<4;i++){
if(numbers[i]==0){
count0++;
}else{
if(numbers[i] == numbers[i+1])
count1++;
}
}
if(count1!=0)
return false;
if(count0==4)
return true;
for(int i=4;i>=1;i--){
numbers[i] = numbers[i] - numbers[i-1];
}
if(count0==3){ // 1,2,3,4
if(numbers[4]>=1 && numbers[4]<=4)
return true;
}
if(count0==2){ // 11,31,13,22
if(numbers[4]==1 && numbers[3]==1
|| numbers[4]==1 && numbers[3]==3
|| numbers[4]==3 && numbers[3]==1
|| numbers[4]==2 && numbers[3]==2)
return true;
}
if(count0==1){ // 111,211,121,112
if(numbers[4]==1 && numbers[3]==1 && numbers[2]==1
|| numbers[4]==2 && numbers[3]==1 && numbers[2]==1
|| numbers[4]==1 && numbers[3]==2 && numbers[2]==1
|| numbers[4]==1 && numbers[3]==1 && numbers[2]==2)
return true;
}
if(count0==0){ // 111
if(numbers[4]==1 && numbers[3]==1 && numbers[2]==1 && numbers[1]==1)
return true;
}
return false;
}
}
根據(jù)上面可以發(fā)現(xiàn)最大值和最小值的差可以是:1,2,3,4
所有就能夠直接根據(jù)這個值進(jìn)行判斷
import java.util.*;
public class Solution {
public boolean isContinuous(int [] numbers) {
if(numbers == null || numbers.length!=5)
return false;
Arrays.sort(numbers);
int flag = 0;
int i = 0;
while(flag<numbers.length && numbers[flag] ==0){
flag++;
}
// falg 就是0 的個數(shù)
// 判斷剩余數(shù)中
// 判斷是不是有相等元素,有相等則返回false
for(int k = flag;k<numbers.length - 1;k++){
if(numbers[k] == numbers[k+1])
return false;
}
// 判斷區(qū)間內(nèi)有幾個數(shù)
int num = numbers[4] - numbers[flag] ;
return num<=4;
}
}