劍指Offer 撲克牌順子

鬼王呵發表於2020-11-24

/**
 * 撲克牌順子
 *
 * 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。
 */
public class JZ045IsContinuous {

    public static boolean isContinuous(int [] numbers) {
        if (numbers == null || numbers.length <= 0) {
            return false;
        }
        quickSort(numbers, 0, numbers.length - 1);
        int diff = 0;
        for (int i = 0; i < numbers.length - 1; i++) {
            if (numbers[i] == 0) {
                continue;
            }
            if (numbers[i] != numbers[i + 1]) {
                diff += numbers[i + 1] - numbers[i];
            } else {
                return false;
            }
        }
        if (diff < numbers.length) {
            return true;
        }
        return false;
    }

    private static void quickSort(int[] numbers, int start, int end) {
        if (start < end) {
            int index = getIndex(numbers, start, end);
            quickSort(numbers, start, index - 1);
            quickSort(numbers, index + 1, end);
        }
    }

    private static int getIndex(int[] numbers, int start, int end) {
        int key = numbers[start];
        while (start < end) {
            while (numbers[end] > key && start < end) {
                end--;
            }
            numbers[start] = numbers[end];
            while (numbers[start] <= key && start < end) {
                start++;
            }
            numbers[end] = numbers[start];
        }
        numbers[start] = key;
        return start;
    }

    public static void main(String[] args) {
        int[] numbers = {1, 3, 5, 7, 0, 0};
        System.out.println(isContinuous(numbers));
    }

}

 

相關文章