一个面试题(关于N张扑克牌能不能连成顺子) 有N张扑克牌(A,2,3,4,5,6,7,8,9,10,J,Q,K),写个程序判断这N张牌里能不能有顺子(顺子是>=5张的连续牌).能就返回组成的顺子(有多少返回多少),不能就返回NULL. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 定义N(<=13)个List,分别存放A-K的总个数;定义一个TreeMap(排序的),以1-13为key,对应的13个List作为value;余下的就是检索这个Map来输出是否有顺子了~ 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); } } }} 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(幻瞳) -----------------谢谢(andycpp(幻瞳))写的可以,还应该改进一下.我觉得你输出的2,3,4,5,6,7,8里还要排列一下,因为长度>=5就可以成顺子,应该还有2,3,4,5,6或3,4,5,6,7或4,5,6,7,8等等.改好了就结分. 其他代码不变,你把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(); } } } } // 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++ 寫的, 供參考. 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 117 8 9 10 11 127 8 9 10 11 12 137 8 9 10 11 12 13 18 9 10 11 128 9 10 11 12 138 9 10 11 12 13 19 10 11 12 139 10 11 12 13 19 10 11 12 139 10 11 12 13 1 不好意思 發錯了, 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;} cft 楼主下次问问题估计没什么人热心回答了很多人花了心思的,没有安慰分。。 上面的算法 可能不是很好理解下面的算法 只要是学国编程的人都看得懂不信 你试试看! 呵呵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(); }} 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(); }} 问个java的编码格式问题 单引号的问题 问题:高手请进, graphic2D setclip 剪切图形不完整 Java桌面程序,左边是树——用swing相关知识,点击不同节点在树的右边显示不同内容,怎么做到?请知道的务必帮帮忙,谢谢!!!在线等!! JAVA如何输出这个图形 SQL安装无反应,怪了 请教 java强制垃圾回收遇到的问题 100分求jasperreport文档? 怎样使程序最小化是时,图标在系统栏(右下角) servlet乱码 看到了java编的桌面软件,散分
定义一个TreeMap(排序的),以1-13为key,对应的13个List作为value;
余下的就是检索这个Map来输出是否有顺子了~
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);
}
}
}
}
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(幻瞳))写的可以,还应该改进一下.我觉得你输出的2,3,4,5,6,7,8里还要排列一下,因为长度>=5就可以成顺子,应该还有2,3,4,5,6或3,4,5,6,7或4,5,6,7,8等等.改好了就结分.
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();
}
}
}
}
//#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++ 寫的, 供參考.
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
正確的程式:
// 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;
}
下次问问题估计没什么人热心回答了
很多人花了心思的,没有安慰分。。
下面的算法 只要是学国编程的人都看得懂
不信 你试试看! 呵呵
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();
}
}
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();
}
}