蓝桥杯 | 扑克排序(详细解析)

一、题目描述

问题描述
  扑克牌排序:构造扑克牌数组,对扑克牌进行排序。
排序原则如下:
数字从小到大是 2-10、J、Q、K 和 A,

花色从小到大是方块(diamond)、梅花(club)、红桃(heart)、黑桃(spade)。

两张牌比较时先看数字,数字相同时看花色

要求对输入的扑克牌进行从小到大排序。

输入五张牌(表示黑桃 2、红桃 3、黑桃 3、方块 A 和梅花 J): 2s3h3sAdJc
  输出结果应为:2 s 3 h 3 s J c A d 数组长度固定为 5

二、代码实现

public class 扑克排序 {
     
	public static void main(String[] args) {
     
		Scanner sc=new Scanner(System.in);
		String s[]=new String[5];
		String str=sc.nextLine();
		int p=0;
		int flag=0;
		int flag2=0;
		for (int i = 0; i <5; i++) {
     			
			s[i]=str.substring(p, p+2);//每两个元素作为一组
			p+=2;
		}
		//System.out.println(Arrays.toString(s));//测试,输出当前数组(输出:[2s, 3h, 3s, Ad, Jc])
		
		for (int i = 0; i < s.length-1; i++) {
     
			char a=s[i].charAt(0);//寻找字符串数组某个下标对应字符串的不同字符
			char b=s[i+1].charAt(0);
			//System.out.println("a="+a+" b="+b);测试,输出当前获取到的a 和b 的值
			if(a=='A') a='K'+1;//耍小聪明:题目说A最大,但是我想按照ACLL码去比较大小,所以把A的权重提升到比K还大
			if(b=='A') b='K'+1;
			for (int j = i; j < s.length-1; j++) {
     
				if(a>b){
     	//交换
					//System.out.println("a>b");测试进入当前分支
					String t=s[j];
					s[j]=s[j+1];
					s[j+1]=t;	
				}
				
				if(a==b){
     
					char c=s[i].charAt(1);
					char d=s[i+1].charAt(1);
					//System.out.println("c="+c+" d="+d);测试进入当前分支
					if(c=='d') flag=1;
					if(c=='c') flag=2;
					if(c=='h') flag=3;
					if(c=='s') flag=4;
					
					if(d=='d') flag2=1;
					if(d=='c') flag2=2;
					if(d=='h') flag2=3;
					if(d=='s') flag2=4;
					
					if(flag>flag2){
     	//交换									
						//System.out.println("c>=d");测试进入当前分支
						String t=s[j];
						s[j]=s[j+1];
						s[j+1]=t;
					}
				}
				
			}
		}	
		String str2="";
		int index=0;//取0或1
		int cur=0;//指示移动(每两个字符移动一次 )
		for (int i = 0; i <2*s.length; i++) {
     			
			str2+=s[cur].charAt(index)+" ";
			if(index==0) index=1;
			else index=0;
			if(index==0) cur++;//每两次
		}
				
		System.out.println(str2);
		
	}
}

测试:
输入:2s3h3sAdJc
输出:2 s 3 h 3 s J c A d

你可能感兴趣的:(算法,字符串,数据结构,算法)