1. 程式人生 > >劍指Offer面試題44:撲克牌的順子 Java實現

劍指Offer面試題44:撲克牌的順子 Java實現

/**************************************************************      
* 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);
	}
}

程式執行結果: