一. 題目
從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的.大小王可看做任意數字.
代碼請到我的代碼庫中下載 Point2Offer
二. 代碼
package week_4;
/**難度係數:***
* 劍指offer: 撲克牌的順子
* 方法: 排序,計算大小王的個數,注意有對子,肯定不是順子
* 測試用例:功能測試(不含王是順子,含王是順子,全是王或四個王,含有對子,不是順子,含王不是順子,空數組)
* @author dingding
* Date:2017-7-7 20:10
* Declaration: All Rights Reserved!
*/
public class No44 {
public static void main(String[] args) {
test1();
test2();
test3();
test4();
test5();
test6();
test7();
}
//solution
private static boolean isContinuous(int[] numbers){
if (numbers == null || numbers.length < 1) {
return false;
}
//排序
hashSort(numbers);
int numberOf0 = 0;
int numberOfGap = 0;
//統計數組中0的個數
for (int i=0;i<numbers.length;i++){
if (numbers[i] == 0) {
numberOf0++;
}
}
//統計數組中間隔的個數
for (int j=0;j<numbers.length;j++){
if (j<4 && numbers[j]!=0 && numbers[j] == numbers[j+1]) {
return false;
}
if (j<4 && numbers[j+1]-numbers[j] !=0 && numbers[j+1]-numbers[j] !=1 && numbers[j]!=0) {
numberOfGap +=numbers[j+1] -numbers[j]-1;
}
}
return (numberOfGap>numberOf0) ? false :true;
}
//藉助輔助空間進行排序
private static void hashSort(int[] numbers) {
if (numbers == null || numbers.length < 1) {
return;
}
int maxNumber = 13;
int[] timesOfNumber = new int[maxNumber+1];
for (int i=0;i<=maxNumber;++i) //所有牌都列出來
timesOfNumber[i] = 0;
for (int j=0;j<numbers.length;++j){ //遍歷數組
int number = numbers[j];
if (number<0 || number>13) {
break;
}
++ timesOfNumber[number];
}
int index = 0;
for (int i=0;i<=maxNumber;++i){
for (int j=0;j<timesOfNumber[i];++j){
numbers[index] = i;
index ++;
}
}
}
/*=================測試用例====================*/
private static void test1() {
int[] a ={1,3,0,4,5};
if(isContinuous(a)){
System.out.println("YES!");
}else {
System.out.println("No!");
}
}
private static void test2() {
int[] a ={2,3,1,4,5};
if(isContinuous(a)){
System.out.println("YES!");
}else {
System.out.println("No!");
}
}
private static void test3() {
int[] a ={0,0,7,0,0};
if(isContinuous(a)){
System.out.println("YES!");
}else {
System.out.println("No!");
}
}
private static void test4() {
int[] a ={0,0,0,0,0};
if(isContinuous(a)){
System.out.println("YES!");
}else {
System.out.println("No!");
}
}
private static void test5() {
int[] a ={0,1,3,0,6};
if(isContinuous(a)){
System.out.println("YES!");
}else {
System.out.println("No!");
}
}
private static void test6() {
int[] a ={0,1,6,0,1};
if(isContinuous(a)){
System.out.println("YES!");
}else {
System.out.println("No!");
}
}
private static void test7() {
int[] a ={};
if(isContinuous(a)){
System.out.println("YES!");
}else {
System.out.println("No!");
}
}
}
有不妥當之處,麻煩告知:D