178

问答题 178 /393

手写代码:5个扑克牌是否是顺子,大小王当成任意的

参考答案

参考回答:

这是剑指offer原题

从扑克牌中随机抽出5张牌,判断是不是一个顺子,即这五张牌是不是连续的。2——10为数字本身,A为1,J为11,Q为12,K为13,而大小王为任意数字。

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