1. 程式人生 > >劍指Offer-撲克牌順子

劍指Offer-撲克牌順子

() 大小 UC interval ack java 心情 boolean 相同

題目描述

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。

思路

  1. 判斷數組長度是否為5
  2. 數組排序
  3. 計算0(王)的個數
  4. 判斷是否有相同數字(對子),有對子,則不是順子
  5. 判斷相鄰數字間隔是否大於王的個數,若王個數>=間隔,則用王來替代間隔的數字

代碼實現

package Other;

import java.util.Arrays;

/**
 * 撲克牌順子
 * 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。
*/ public class Solution47 { public static void main(String[] args) { Solution47 solution47 = new Solution47(); int[] numbers = {1, 2, 3, 4, 5}; System.out.println(solution47.isContinuous(numbers)); } public boolean isContinuous(int[] numbers) { if (numbers.length
< 5) return false; Arrays.sort(numbers); int cnt = 0;//統計王的數量 for (int num : numbers) { if (num == 0) { cnt++; } } for (int i = cnt; i < numbers.length - 1; i++) { if (numbers[i + 1] == numbers[i]) return false; int interval = numbers[i + 1] - numbers[i] - 1;//相鄰數字間隔 //若相鄰數字間隔大於王的個數,返回false if (interval > cnt) { return false; } cnt -= interval;//用王來補間隔 } return true; } }

劍指Offer-撲克牌順子