劍指Offer面試題44:撲克牌的順子 Java實現
阿新 • • 發佈:2019-01-26
/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0 * 題目描述:撲克牌的順子 * 從撲克牌中隨機抽出5張牌,判斷是不是一個順子,即這五張牌是不是連續的。2——10為數字本身, * A為1,J為11,Q為12,K為13,而大小王為任意數字。 * 輸入描述:請輸入五張牌: * 0 0 3 4 7 * 程式輸出: 這是一張順子撲克牌 * 問題分析: 無 * 演算法描述: 於是我們需要做3件事:首先把陣列排序,再統計陣列中0的個數,最後統計排序之後陣列中相鄰的數字之間的空缺總數。 * 如果空缺綜述小於或者等於0的個數,那麼這個陣列就是連續的;反之則不連續。 * 完成日期:2016-09-27 ***************************************************************/ package org.marsguo.offerproject44; import java.util.Scanner; class SolutionMethod1{ public void sortfun(int[] arrays,int start, int end){ int numOfZero=0; if(start>=end){ //判斷陣列的起始和終止是否相同,相同表示已經都全部排完,返回 return; } int i = start; //i指向陣列的起始位 int j = end; //j指向陣列的末位 int key = arrays[i]; //選取陣列的第一位為關鍵字key,基準元素 boolean flag = true; //設定標誌位,用於判斷是i++還是j--;這個很重要 while(i != j){ //如果i≠j,表示還沒有比較完,即即關鍵字左右兩側還不是最小與最大 if(flag){ if(key>arrays[j]){ //從後向前遍歷,找到小於key的值, swap(arrays,i,j); //找到小於key的值後將arrays[i]與此值交換 flag = false; }else{ //如果沒有找到的話j--,向前遍歷 j--; } }else{ if(key<arrays[i]){ //從前向後遍歷,找到大於key的值 swap(arrays,i,j); //將此值與arrays[j]進行交換 flag = true; }else{ //如果沒有找到話就將i++,向後遍歷 i++; } } } //sprint(arrays); //列印每次排序後的陣列 sortfun(arrays,start,j-1); //遞迴呼叫,將基準元素的前半段陣列再用此方法進行排序,直到所有都排完為止。 sortfun(arrays,i+1,end); //遞迴呼叫,將基準元素的後半段陣列再用此方法進行排序,直到所有都排完為止。 //System.out.println("排序後的陣列是:"); for(int k = 0; k < arrays.length; k++){ if(arrays[k] == 0){ numOfZero++; } //System.out.print("numOfZero= " + numOfZero + ";"+arrays[k] + ", "); //System.out.print(arrays[k] + ", "); } IsContinuousFun(arrays, numOfZero); } public void swap(int[] array,int i,int j){ int temp; temp = array[i]; array[i] = array[j]; array[j] = temp; } public void IsContinuousFun(int[] array,int numOfZero){ int numOfGap = 0; //判斷數字中間空了多少個0 //System.out.println("numberOfZero = " + numOfZero); for(int j = 1; j < array.length; j++){ int flag = array[j] - array[j-1]; //用排序陣列中後一個數字-前一個數字 if(array[j] == array[j-1] && array[j] != 0){ //如果陣列中有重複的非0數字,則不是順子,退出 System.out.println("有重複數字,不是順子牌"); return; } else if(flag != 1 && flag != 0 && array[j-1] != 0){ //判斷不是連續的數字,也不是0, numOfGap += flag-1; //非0數字間缺少的數字的個數 } } if(numOfZero != numOfGap){ System.out.println("這不是一個順子撲克牌"); } else{ System.out.println("這是一張順子撲克牌"); } } } public class IsContinuous { public static void main(String[] args){ Scanner scanner = new Scanner(System.in); //掃描鍵盤輸入 System.out.println("請輸入五張牌:"); String str = scanner.nextLine(); //將鍵盤輸入轉化為字串 String[] temp = str.split(" "); //將字串用“ ”分開轉化為字串陣列 scanner.close(); int[] array = new int[temp.length]; //定義一個整型陣列array for(int i = 0; i< temp.length; i++){ //將字串陣列強制轉化為整型陣列 array[i] = Integer.parseInt(temp[i]); //這種方法非常巧妙 } SolutionMethod1 solution1 = new SolutionMethod1(); //solution1.quicksort(array, 0, array.length-1); solution1.sortfun(array, 0, array.length-1); } }
程式執行結果: