模拟笔试第二题:字符串分组
PS: sort完set这个方法是可行的
代码:
public static void main(String[] args){Scanner in = new Scanner(System.in);while (in.hasNext()){int n = in.nextInt();HashSet<String> SS = new HashSet<>();for (int i = 0; i < n; i++) {char[] chars = in.next().toCharArray();Arrays.sort(chars);SS.add(new String(chars));}System.out.println(SS.size());}}
但我想问的是下面的方法错在哪里谢谢
-------原帖------
第二题字符串分组,一直AC 90%,求指导下哪边漏了
基本思路,用HashMap统计字符串中每个字符出现次数,然后以 字符串长度+唯一字符个数
拼接作为key,建立个HashMap,value是ArrayList,用来放字符分布情况的统计HashMap;新字符串先统计各个字符出现情况,然后以
字符串长度+唯一字符个数 作为key找到对应的字符分布情况的list,然后遍历判断当前字符串的字符分布情况是否已经存在。
代码:
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int n = in.nextInt();
Map<String, List<Map<Character, Integer>>> dicts = new HashMap<>();
int group = 0;
for (int i = 0; i < n; i++) {
String ss = in.next();
int sl = ss.length();
// 统计当前字符串的字符出现情况
Map<Character, Integer> c_n = new HashMap<>();
for (int j = 0; j < sl; j++) {
char c = ss.charAt(j);
if (c_n.containsKey(c))
c_n.put(c, c_n.get(c)+1);
else c_n.put(c, 1);
}
String k = sl+""+c_n.size();
if (dicts.containsKey(k)){
boolean flag = true;
List<Map<Character, Integer>> vl = dicts.get(k);
// 判断当前字符串的字符分布是否已经存在
for (Map<Character, Integer> v: vl) {
flag = true;
for (char c:v.keySet()) {
if (!c_n.containsKey(c) || v.get(c) != c_n.get(c)){
flag = false;
break;
}
}
}
if (!flag){
group += 1;
dicts.get(k).add(c_n);
}
}else {
group += 1;
dicts.put(k, new ArrayList<>(Collections.singletonList(c_n)));
}
}
System.out.println(group);
}
}
}
美的集团公司福利 767人发布
