广州百田软件研发笔试题:求一套扑克牌中怎样出最后剩下的单牌数最少,只能出顺子和对(2/3/4)
2013-03-16 22:55
309 查看
题目是这样的:有n张扑克牌,每张牌的取值范围是:2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13),A(14)。(同样的牌的数目不超过4张)。可以出对子,三张一样的,四张一样的或者顺子,怎样出最后剩下的单牌最少。
思路:首先考虑找出顺子。我的思路其实很简单,首先就是要去掉重复的牌,因为同样的顺子之算一个,显然JAVA中的Set很适合这个工作。同时又需要对这些牌进行排序,毫无疑问就是TreeSet了。然后从小到大遍历这些牌,并设置一个计数器count。若发现连续的牌,则count++;若发现不连续的,分2中情况:若count>4,则找到了一个顺子,存起来;反之则什么都不做。然后count=1,从新开始找顺子。下面就是代码:
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 printResult1(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();
}
}
}
}
//不将长顺子进行分解的打印模式
private static void printResult2(ArrayList<String> result) {
if(result.size() == 0) {
System.out.println(“没有顺子!!”);
}else {
System.out.println(“共有”+result.size()+”个顺子:”);
for(String s:result) {
System.out.println(s);
}
}
}
}
思路:首先考虑找出顺子。我的思路其实很简单,首先就是要去掉重复的牌,因为同样的顺子之算一个,显然JAVA中的Set很适合这个工作。同时又需要对这些牌进行排序,毫无疑问就是TreeSet了。然后从小到大遍历这些牌,并设置一个计数器count。若发现连续的牌,则count++;若发现不连续的,分2中情况:若count>4,则找到了一个顺子,存起来;反之则什么都不做。然后count=1,从新开始找顺子。下面就是代码:
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 printResult1(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();
}
}
}
}
//不将长顺子进行分解的打印模式
private static void printResult2(ArrayList<String> result) {
if(result.size() == 0) {
System.out.println(“没有顺子!!”);
}else {
System.out.println(“共有”+result.size()+”个顺子:”);
for(String s:result) {
System.out.println(s);
}
}
}
}
相关文章推荐
- 2011年百度软件研发工程师广州笔试面试题
- 百度 软件研发工程师笔试题 2013/10/13 广州考场
- 阿里巴巴2014秋季校园招聘-软件研发工程师笔试题 续
- 广州百田笔试题(武大专场)
- 2014阿里巴巴秋季校园招聘-软件研发工程师笔试题/面试问题收集
- 百度 合肥地区 软件研发工程师 笔试题
- 3g门户 &go桌面--2014届--广州--Android研发工程师(笔试、1、2面总结)
- 百度2013校园招聘笔试题[软件研发]及答案
- 公开课:超越敏捷-软件研发项目管理最佳实践(2012-5-12 广州)
- 2016腾讯春招软件研发实习笔试
- 2013年9月份百度校园招聘软件研发工程师(沈阳)笔试题回顾
- 2012年百度软件研发工程师(上海)笔试题-杭州站
- 百度 2014 校园招聘 软件研发工程师 笔试题(天津站)
- 笔试题:扑克牌顺子
- 【校园招聘】2013百度软件研发笔试题
- 【笔试】53、圆圈中最后剩下的数字(约瑟夫环)
- 怎样才能把一个代码变成软件成品?一个初学者的困惑,我们写的代码都只能是解决一些数学问题而已。怎么把它变成一个软件。
- 百度2013校园招聘笔试题[软件研发类]及分析
- 2014百度校园招聘笔试题(上海软件研发工程师)
- 一道笔试题(扑克牌顺子)