撲克牌順子
阿新 • • 發佈:2018-12-21
題目描述
LL今天心情特別好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王(一副牌原本是54張_)…他隨機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!!“紅心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是順子…LL不高興了,他想了想,決定大\小 王可以看成任何數字,並且A看作1,J為11,Q為12,K為13。上面的5張牌就可以變成“1,2,3,4,5”(大小王分別看作2和4),“So Lucky!”。LL決定去買體育彩票啦。 現在,要求你使用這幅牌模擬上面的過程,然後告訴我們LL的運氣如何, 如果牌能組成順子就輸出true,否則就輸出false。為了方便起見,你可以認為大小王是0。 思路:大王小王相當於癩子,可以百搭,所以需要知道癩子的數量
- 想法一,根據癩子數量分類討論。程式碼如下
class Solution { public: bool IsContinuous( vector<int> numbers ) { if(numbers.empty()) return false; sort(numbers.begin(),numbers.end()); int i = 0; while(numbers[i]==0)//統計癩子數量 { i++; } if(i==4) return true;//4個癩子,必定能組成順子 else if(i==3)//3個癩子,剩下的兩張牌可以是相鄰,或者為順子的最大值和最小值,相差在1~4之間 { if((numbers[4]-numbers[3])>=1&&(numbers[4]-numbers[3])<=4) return true; else return false; } else if(i==2)//2個癩子,剩下的3張牌中最大值和最小值之差在2~4之間,2個癩子可以填充在3張牌之外,也可以填充在3張牌之間,還有一點要注意的3張牌中不能有重複的 { if((numbers[4]-numbers[2])>=2&&(numbers[4]-numbers[2])<=4&&(numbers[4]!=numbers[3])&&(numbers[3]!=numbers[2])) return true; else return false; } else if(i==1)//1個癩子,剩下的4張牌中最大值和最小值之差在3~4之間,不能有重複的牌 { if((numbers[4]-numbers[1])>=3&&(numbers[4]-numbers[1])<=4&&(numbers[4]!=numbers[3])&&(numbers[3]!=numbers[2])&&(numbers[2]!=numbers[1])) return true; else return false; } else //0個癩子,max-min==4,且不能有重複的牌 { if((numbers[4]-numbers[0])==4&&(numbers[4]!=numbers[3])&&(numbers[3]!=numbers[2])&&(numbers[2]!=numbers[1])&&(numbers[1]!=numbers[0])) return true; else return false; } } };
- 想法二,通過上述程式碼,可以發現,沒有癩子的情況,5張牌能組成癩子的充分必要條件:max-min==4&&不能有重複值,考慮下有癩子的情況,對已有的max和min並沒有影響,對重複值也沒有影響,影響的是Max-min的值,0個癩子,值為4,1個癩子,值為3或4,2個癩子,值為2,3,4,,3個癩子,值為1,2,3,4, 4個癩子必定可以組成順子,所以癩子的數量不一定需要知道,上面的程式碼中,是經過排序的,經過上面的論述,發現其實不需要排序,只要記錄癩子的數量,max ,min這3個值,max-min的值不能大於等於5。根據這個思路,程式碼如下:
class Solution { public: bool IsContinuous( vector<int> numbers ) { if(numbers.empty()) return false; int max = 0; int min = 14; int temp = 15;//記錄上一個值,與下一個進行比對 for(int i = 0;i<numbers.size()-1;i++) { if(temp==numbers[i]) return false;//重複 if(numbers[i]==0)//是癩子的,則結束本次迴圈 { continue; } if(numbers[i]>max) max = numbers[i];//記錄最大值 if(numbers[i]<min) min = numbers[i];//記錄最小值 temp = numbers[i]; if(max-min>=5) return false;//如果過程中出現max-min>=5說明不可能組成順子 } return true; } };
經過上面的程式碼,發現癩子的數量不需要知道,只要滿足這二個條件即可
- 不能有重複值
- 在滿足條件一的情況下,最大值減去最小值不能超過5