演算法系列 撲克牌的順子

2021-08-07 09:12:09 字數 1314 閱讀 5925

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的運氣如何。為了方便起見,你可以認為大小王是0

我們可以把 5 張牌看成由 5 個數字組成的陣列。大、小王是特殊的數字,我們不妨把它們都定義為 0,這樣就能和其他撲克牌區分開來了。

接下來我們分析怎樣判斷 5 個數字是不是連續的,最直觀的方法是把陣列排序。值得注意的是,由於 0 可以當成任意數字,我們可以用 0 去補滿陣列中的空缺。如果排序之後的陣列不是連續的,即相鄰的兩個數字相隔若干個數字,但只要我們有足夠的。可以補滿這兩個數字的空缺,這個陣列實際上還是連續的。舉個例子,陣列排序之後為在 1 和 3 之間空缺了乙個 2,剛好我們有乙個 0,也就是我們可以把它當成 2 去填補這個空缺。

於是我們需要做 3 件事情: 首先把陣列排序,再統計陣列中 0 的個數,最後統計排序之後的陣列中相鄰數字之間的空缺總數。如果空缺的總數小於或者等於 0 的個數,那麼這個陣列就是連續的:反之則不連續。

最後,我們還需要注意一點: 如果陣列中的非 0 數字重複出現,則該陣列不是連續的。換成撲克牌的描述方式就是如果一副牌裡含有對子,則不可能是順子。

public

class solution

// 對元素進行排序

arrays.sort(numbers);

//統計陣列中0的個數

int numberofzero = 0;

int numberofgap = 0;

for (int i = 0; i < numbers.length; i++)

//統計陣列中相鄰數字之間的空缺總數,從第二個非0位置開始

for(int i=numberofzero+1;iint gap=numbers[i]-numbers[i-1];

//兩張牌數字一樣,不是順子

if(gap==0)

return

false;

//如果相差大於1,則統計間隔數,注意減一

if(gap>1)

numberofgap+=gap-1;

}return numberofzero>=numberofgap;

}}

撲克牌順子

ll今天心情特別好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王 一副牌原本是54張 他隨機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!紅心a,黑桃3,小王,大王,方片5 oh my god 不是順子.ll不高興了,他想了想,決定大 小...

撲克牌順子

題目描述 ll今天心情特別好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王 一副牌原本是54張 他隨機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!紅心a,黑桃3,小王,大王,方片5 oh my god 不是順子 ll不高興了,他想了想,...

撲克牌順子

ll今天心情特別好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王 一副牌原本是54張 他隨機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!紅心a,黑桃3,小王,大王,方片5 oh my god 不是順子 ll不高興了,他想了想,決定大 小...