一个面试题(关于N张扑克牌能不能连成顺子)

cursor_wang 2007-08-13 05:35:17
有N张扑克牌(A,2,3,4,5,6,7,8,9,10,J,Q,K),写个程序判断这N张牌里能不能有顺子(顺子是>=5张的连续牌).能就返回组成的顺子(有多少返回多少),不能就返回NULL.
...全文
2045 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
liyang_ly 2007-08-17
  • 打赏
  • 举报
回复
package math;

import java.util.*;

public class Calculate {
private void caculated() {
char arr[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'J','O', 'K'};
int n = 0;
for (int k = 0; k < 9; k++) {
for (int i = n; i <= arr.length - 5; i++) {

for (int j = n; j < 5 + i; j++) {
System.out.print(arr[j]);
}
System.out.println();
}
n = n + 1;
}
}
public static void main(String[] args) {
Calculate calculate = new Calculate();
calculate.caculated();
}
}
liyang_ly 2007-08-17
  • 打赏
  • 举报
回复
上面的算法 可能不是很好理解
下面的算法 只要是学国编程的人都看得懂
不信 你试试看! 呵呵
package math;

import java.util.*;

public class Calculate {
private void caculated() {
char arr[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'J',
'O', 'K'};
int n = 0;
for (int k = 0; k < 9; k++) {
for (int i = 0+n; i <= arr.length - 5; i++) {

for (int j = n; j < 5 + i; j++) {
System.out.print(arr[j]);
}
System.out.println();
}
n = n + 1;
}
}
public static void main(String[] args) {
Calculate calculate = new Calculate();
calculate.caculated();
}
}
imcreasy 2007-08-16
  • 打赏
  • 举报
回复
题设含糊,要求不明确,bs之
zdjray 2007-08-16
  • 打赏
  • 举报
回复
cft 楼主
下次问问题估计没什么人热心回答了
很多人花了心思的,没有安慰分。。
glvicky 2007-08-16
  • 打赏
  • 举报
回复
喜欢believefym(feng)的点子~``
cqhaibin 2007-08-15
  • 打赏
  • 举报
回复
天啊,有点麻烦哟!
piglet8792 2007-08-15
  • 打赏
  • 举报
回复
6.6
rongcanf 2007-08-14
  • 打赏
  • 举报
回复
还是believefym强含啊
qghktit 2007-08-14
  • 打赏
  • 举报
回复
不好意思 發錯了, SORRY!!!
正確的程式:
// Shunzi.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdlib.h"
#include "iostream.h"
#define POINTNUM 5 ///最多有13張牌 可以自行設置
//using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//char pk[13] = {'A', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'};
int Judge[15] = {0};
if(POINTNUM < 5)
{
cout<<"不符合要求的輸入";
exit(0);
}
cout << "請輸入你所得的牌點數"<<endl;
for (int i=0, char ch; i<POINTNUM; i++)
{
cin>> ch;
switch(ch)
{
case 'A': Judge[1]++; break;
case '1': Judge[2]++; break;
case '2': Judge[3]++; break;
case '3': Judge[4]++; break;
case '4': Judge[5]++; break;
case '5': Judge[6]++; break;
case '6': Judge[7]++; break;
case '7': Judge[8]++; break;
case '8': Judge[9]++; break;
case '9': Judge[10]++; break;
case '10': Judge[11]++; break;
case 'J': Judge[12]++; break;
case 'Q': Judge[13]++; break;
case 'K': Judge[14]++; break;
}
}
int nCount = 0;
for (int j=1; j<15; )
{
if (Judge[j] > 1) ///有二張以上一樣的牌
{
cout<<"您的牌點不是順子"<<endl;
return 0;
break;
}
if (!Judge[j])
{
j++;
}
nCount = 1;
for (int k=j; k<15&& ((15-j)>=POINTNUM);)
{
if (Judge[k] == Judge[k+1])
{
nCount++;
}
else
{
break;
}
if (nCount == POINTNUM)
{
cout<<"恭喜!您的牌點是順子"<<endl;
return 0;
//break;
}
}
j++;
}
return 0;
}
zl_inter 2007-08-14
  • 打赏
  • 举报
回复
public static void getCards(int[] cards){
Arrays.sort(cards);
boolean hasAce = false;
String result = "";
int before = 0;
int len = 0;
for(int i=0;i<=cards.length-5;i++){
result = "" + cards[i];
before = cards[i];
len = 1;
for(int j=i+1;j<cards.length;j++){
if(cards[i]==1){
hasAce = true;
break;
}
if(cards[j]-before>1){
break;
}else if(cards[j]-before==0){
before = cards[j];
continue;
}else{
before = cards[j];
result = result + " " + cards[j];
len++;
if(len>=5){
System.out.println(result);
}
if(cards[j]==13&&len>=4&&hasAce){
System.out.println(result + " 1");
}
}
}
}
}

int[] d = {1,10,12,9,2,5,9,7,13,8,11};
输出:
7 8 9 10 11
7 8 9 10 11 12
7 8 9 10 11 12 13
7 8 9 10 11 12 13 1
8 9 10 11 12
8 9 10 11 12 13
8 9 10 11 12 13 1
9 10 11 12 13
9 10 11 12 13 1
9 10 11 12 13
9 10 11 12 13 1
qghktit 2007-08-14
  • 打赏
  • 举报
回复
// Shunzi.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdlib.h"
#include "iostream.h"
#define POINTNUM 5 ///最多有13張牌 可以自行設置
//using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//char pk[13] = {'A', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'};
int Judge[15] = {0};
if(POINTNUM < 5)
{
cout<<"不符合要求的輸入";
exit(0);
}
cout << "請輸入你所得的牌點數"<<endl;
for (int i=0, char ch; i<POINTNUM; i++)
{
cin>> ch;
switch(ch)
{
case 'A': Judge[1]++; break;
case '1': Judge[2]++; break;
case '2': Judge[3]++; break;
case '3': Judge[4]++; break;
case '4': Judge[5]++; break;
case '5': Judge[6]++; break;
case '6': Judge[7]++; break;
case '7': Judge[8]++; break;
case '8': Judge[9]++; break;
case '9': Judge[10]++; break;
case '10': Judge[11]++; break;
case 'J': Judge[12]++; break;
case 'Q': Judge[13]++; break;
case 'K': Judge[14]++; break;
}
}
for (int j=1; j<15; )
{
if (Judge[j] > 1) ///有二張以上一樣的牌
{
cout<<"您的牌點不是順子"<<endl;
return 0;
break;
}
if (!Judge[j])
{
j++;
}
for (int k=j; k<15 && ((15-j)>=5) && (k<=POINTNUM);)
{
if (!Judge[k+1])
{
j++;
break;
}
else if (Judge[k+1] > 1)
{
cout<<"您的牌點不是順子"<<endl;
return 0;
break;
}
else
k++;
if (k == POINTNUM)
{
cout<<"恭喜!您的牌點是順子"<<endl;
break;
}
}
j++;
}
return 0;
}

本人用C++ 寫的, 供參考.
wj_526 2007-08-14
  • 打赏
  • 举报
回复
牛人,都是牛人
lexchi 2007-08-14
  • 打赏
  • 举报
回复
有星在头上的人就是不一样啊,赞一个!
silence_jiliao 2007-08-14
  • 打赏
  • 举报
回复
就是个状态机
andycpp 2007-08-13
  • 打赏
  • 举报
回复
其他代码不变,你把printResult函数替换为下面新的实现就可以了

private static void printResult(ArrayList<String> result) {
int count = 0;
String[] nodes = null;
if(result.size() == 0) {
System.out.println("没有顺子!!");
}else {
for(String s:result) {
nodes = s.split(",");
count += (1+(nodes.length-4))*(nodes.length-4)/2;
}
System.out.println("共有"+count+"个顺子:");
for(String s:result) {
nodes = s.split(",");
for(int i=5; i<=nodes.length; i++)
for(int j=0; i-j>4; j++) {
System.out.print(nodes[j].trim());
for(int x = j+1; x<i; x++) {
System.out.print("," + nodes[x]);
}
System.out.println();
}
}
}
}
andycpp 2007-08-13
  • 打赏
  • 举报
回复
我崩溃。。。。。
你的意思是
2345678里面共有6个顺子??????

23456
234567
2345678
34567
345678
45678
cursor_wang 2007-08-13
  • 打赏
  • 举报
回复
andycpp(幻瞳)
-----------------
谢谢(andycpp(幻瞳))写的可以,还应该改进一下.我觉得你输出的2,3,4,5,6,7,8里还要排列一下,因为长度>=5就可以成顺子,应该还有2,3,4,5,6或3,4,5,6,7或4,5,6,7,8等等.改好了就结分.
believefym 2007-08-13
  • 打赏
  • 举报
回复
0 0000 0000 0000

用13位表示整个牌序列,数组里面有这张牌,就将相应的位置1,也就是上面的位或操作

最终表示位一个1、0序列,判断就变成是否有连续5个1存在,就用移位(11111)2进行位与运算
believefym 2007-08-13
  • 打赏
  • 举报
回复
int[] d = {1,2,3,4,5,6,7,8,10,11,12,13};
int s = 0;
for(int i=0; i<d.length; ++i){
s |= 1<<(d[i]-1);
}
if((s&1)==1)
s |= 1<<(14-1);//有1在的时候也可以当A

int l = 0x1f;//11111
int total = 0;
for(int i=0; i<=9; ++i){
if(((l<<i)&s) == (l<<i))
++total;
}
System.out.println(total);
andycpp 2007-08-13
  • 打赏
  • 举报
回复
import java.util.ArrayList;
import java.util.TreeSet;

public class Main {

/**
* @param args
*/
public static void main(String[] args) {

String[] cards = {"6", "2" ,"3" ,"7" ,"4", "5", "8", "8", "10", "10", "10", "J", "K", "Q", "A"};
TreeSet<Integer> set = init(cards);
ArrayList<String> result = check(set);
printResult(result);

System.out.println("程序结束!!");




}

private static TreeSet<Integer> init(String[] cards) {
TreeSet<Integer> set = new TreeSet<Integer>();
for(String s:cards) {
if(s.charAt(0)>='1'&&s.charAt(0)<='9') {
set.add(Integer.parseInt(s));
}else {
switch(s.toUpperCase().charAt(0)) {
case 'J':
set.add(11); break;
case 'Q':
set.add(12); break;
case 'K':
set.add(13); break;
case 'A':
set.add(14); break;
}
}
}
return set;

}

private static ArrayList<String> check(TreeSet<Integer> set) {
ArrayList<String> result = new ArrayList<String>();
StringBuilder temp = new StringBuilder();
int count = 0;
Integer[] nums = new Integer[1];
nums = set.toArray(nums);
int begin = 0;
for(Integer i:set) {
if(count == 0) {
begin = i;
count++;
temp.append(numToCard(begin));
}else if(i == begin+count) {
temp.append(", "+numToCard(i));
count++;
}else {
if(count>4) {
result.add(temp.toString());
}
begin = i;
temp.replace(0, temp.length(), numToCard(i)+"");
count = 1;
}
}

if(count>4) result.add(temp.toString());
return result;
}

private static String numToCard(int x) {
if(x>10) {
switch(x) {
case 11:
return "J";
case 12:
return "Q";
case 13:
return "K";
case 14:
return "A";
}
}else {
return x+"";
}
return null;
}

private static void printResult(ArrayList<String> result) {
if(result.size() == 0) {
System.out.println("没有顺子!!");
}else {
System.out.println("共有"+result.size()+"个顺子:");
for(String s:result) {
System.out.println(s);
}
}
}
}
加载更多回复(4)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧