取字符,第二届蓝桥杯Java大赛决赛题


从键盘读入一个由字母构成的串(不大于30个字符)。

从该串中取出3个不重复的字符,求所有的取法。

取出的字符,要求按字母升序排列成一个串。

不同的取法输出顺序可以不考虑。


例如:
输入:
abc
则输出:
abc

输入:
abcd
则输出:
abc
abd
acd
bcd

输入:
abcaa
则输出:
abc

要求考生把所有类写在一个文件中。
调试好后,存入与考生文件夹下对应题号的“解答.txt”中即可。
相关的工程文件不要拷入。请不要使用package语句。
另外,源程序中只能出现JDK1.5中允许的语法或调用。不能使用1.6或更高版本。

 

 

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class QuZiFu {
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		String str=scan.next();
		if(str.length()<3){
			System.out.println("请输入3个以上字符的串!");
			System.exit(0);
		}
		List list=new ArrayList<String>();
		for (int i = 0; i < str.length(); i++) {
			for (int j = 0; j < str.length(); j++) {
				for (int k = 0; k < str.length(); k++) {
					if(i==j||j==k||i==k||String.valueOf(str.charAt(i)).equals(String.valueOf(str.charAt(j)))
							||String.valueOf(str.charAt(i)).equals(String.valueOf(str.charAt(k)))
							||String.valueOf(str.charAt(j)).equals(String.valueOf(str.charAt(k)))){
						continue;
						//i==j||j==k||i==k这三个条件是判断如果下标相等,则肯定有重复的字母
						//后边三个条件是判断这种情况abcaa,下标不相等,但是内容相等.
					}
					//temp取到三个不同的字符后,转换为字符串。
					String temp=String.valueOf(str.charAt(i))+String.valueOf(str.charAt(j))+String.valueOf(str.charAt(k));
					if(judge(list,temp)||list.size()==0){	//调用判断函数,如果temp在list里没有的话,把temp加进list中去。
						//list.size()==0是当没有元素时,直接加进去。
						list.add(temp);
					}
				}
			}
		}
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));	//输出
		}
	}
	static boolean judge(List<String> list,String temp){//temp为当前字符串,list保存的是已经加进去的字符串
		boolean f=false;
		char[] c1=temp.toCharArray();	//将当前串转换为字符数组
		java.util.Arrays.sort(c1);		//将当前串排序,排序的目的是:如,abc和acb俩个字符串经过排序后都是abc,好比较!
		String temp1=new String(c1);	//转换为字符串
		for (int i = 0; i < list.size(); i++) {
			char[] c2=list.get(i).toCharArray();//将list中串转换为字符数组
			java.util.Arrays.sort(c2);			//将list串排序
			String temp2=new String(c2);		//list串转换为字符串
			if(!temp2.equals(temp1)){			//经过排序后的当前字符串如果和list中的串不相等的话
				f=true;							//f=true可以加入list
			}else{
				f=false;						//否则false,不加入list,跳出循环
				break;
			}
		}
		return f;								//返回结果
	}
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值