当前位置: 首页 >> 程序设计 >> Java >> Java: 在n 张扑克牌中找出顺子
 

Java: 在n 张扑克牌中找出顺子

作者:      来源:http://blog.csdn.net/andycpp     发表时间:2007-08-18     浏览次数:      字号:    

        这是今天在论坛看到的一个题目,挺有意思的,我做了一下,得了28分。呵呵,很有成就感,干脆写到博客里面算了。

       题目是这样的:有n张扑克牌,每张牌的取值范围是:2,3,4,5,6,7,8,9,10,J,Q,K,A。在这n张牌中找出顺子(5张及5张以上的连续的牌),并将这些顺子打印出来。

        思路:我的思路其实很简单,首先就是要去掉重复的牌,因为同样的顺子之算一个,显然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);
            }

        }

    }

}

 

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
由于扑克牌的取值范围很小,只是[2-14]。所以本文中的去掉重复的牌和排序可以用更简单,速度更快的方法。 代码大致如下: boolean[] distinctCards = new boolean[14]; //如果不去掉重复值只是排序这个数组要使用int[] for( int i = 0 ; i < cards.length; i++ ) { distinctCards[cards[i]] = true; //如果不去掉重复值只是排序这里是 distinctCards[cards[i]] ++; } 从小到大扫描一边distinctCards就可以得到排序的不重复的牌。 这种排序方法是时间复杂度是O(n)的。限制就是目标元素的取值范围不能太大。否则new boolean[]要消耗很多内存 其他问题可以到www.actuatechina.com交流
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •