赛题:
题目大意
输入一些单词,要求程序返回出一些满足如下要求的单词:
- 这个单词字母在忽略大小写的情况下,通过字母重排不可以组成输入里的其他单词。
- 输出该单词时每个字母的大小写与输入时完全一致。
- 输出单词按照单词的字典序排列
小黑题解
- 我们在判断每个单词是否满足条件前,可以现将每个单词进行标准化(先将每个字母统一转化成小写,然后使用冒泡排序对每个字符进行排序),之后用map存放(以标准化的字符串为key,以原字符串为value)
- 使用可变长数组Vector中存储每个标准化后的字符串,然后统计Vector里每个字符串的个数,将只出现一次的字符串找出来,并存放到TreeSet中。
- 将TreeSet中的字符串通过迭代器依次打印出来,即是按照字典序并满足要求的字符串。
小黑提示
- 将字符串保存在TreeSet集合中,无论元素输入的顺序,输出时一定是按字典序输出的。
- 有人质疑,也许会有两个标准化后相同的字符串,通过map存储时由于key相同,而导致存储缺失。其实结果的确如此,不过我们的目的是返回满足符合要求的字符串,如果key都与其他某个单词相同了,那么这个单词一定不符合题意。也就是说我们在通过标准化单词映射原单词的过程中,一定不会用到这个key,所以这个单词是否被存储,都不影响结果。
程序实现
package 例题;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
public class Ananagrams {
static Vector<String> vectors; //可变数组
static Map<String,String> map; //map映射
static Set<String> set; //set集合
static Iterator<String> iterator; //迭代器
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
vectors = new Vector<String>();
map = new TreeMap<String,String>();
System.out.println("请输入单词集合:");
String str = sc.next();
Set<String> set = new TreeSet<String>(); //初始化TreeSet集合
while(!str.equals("#")){ //输入单词过程
String s = str.toLowerCase(); //统一转化为小写
char[] arr = s.toCharArray(); //将字符串转化为字符数组
sort(arr); //冒泡排序
String value = new String(arr); //返回标准化后的字符串
map.put(value, str); //生成键值对<标准化单词,原单词>
vectors.add(value); //将标准化单词加入vectors中
str = sc.next();
}
int length = vectors.size();
for (int i = 0; i < length; i++) { //判断每个标准化单词出现的个数,保留至出现一次的单词
boolean f = true;
String a = vectors.get(i);
for (int j = 0; j < length; j++) {
if(vectors.get(j).equals(a) && j != i){
f = false;
break;
}
}
if(f){
set.add(map.get(a)); //找到了,通过映射得到原单词,并放入TreeSet中
}
}
iterator = set.iterator(); //生成迭代器,并迭代输出
while(iterator.hasNext()){
System.out.println(iterator.next());
}
sc.close();
}
public static void sort(char[] arr){ //冒泡排序过程
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if(arr[j]>arr[j+1]){
char temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}
结果