一、题目
描述
给定 m 个字符串,请计算有哪些字符在所有字符串中都出现过 n 次及以上。
解答要求
时间限制:1000ms, 内存限制:256MB
输入
- 首行是整数 n ,取值范围 [1,100]
- 第二行是整数 m ,表示字符串的个数,取值范围 [1,100]
- 接下来 m行,每行一个仅由英文字母和数字组成的字符串,长度范围 [1,1000)
输出
按ASCII码升序输出所有符合要求的字符序列; 如果没有符合要求的字符,则输出空序列 [ ]。
样例
输入样例 1
2
3
aabbccFFFFx2x2
aaccddFFFFx2x2
aabcdFFFFx2x2
输出样例 1
[2 F a x]
二、代码模板
package test;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class test3 {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in, StandardCharsets.UTF_8.name());
int nValue = cin.nextInt();
int mValue = cin.nextInt();
cin.nextLine();
String[] strings = new String[mValue];
for (int i = 0; i < mValue; i++) {
strings[i] = cin.nextLine();
}
cin.close();
char[] results = getNTimesCharacter(nValue, strings);
System.out.print("[");
for (int i = 0; i < results.length; i++) {
if (i == 0) {
System.out.print(results[i]);
} else {
System.out.print(" " + results[i]);
}
}
System.out.print("]");
}
// 待实现函数,在此函数中填入答题代码
private static char[] getNTimesCharacter(int nValue, String[] strings) {
return new char[0];
}
}
三、个人代码结果
import java.nio.charset.StandardCharsets;
import java.util.*;
public class test3 {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in, StandardCharsets.UTF_8.name());
int nValue = cin.nextInt();
int mValue = cin.nextInt();
cin.nextLine();
String[] strings = new String[mValue];
for (int i = 0; i < mValue; i++) {
strings[i] = cin.nextLine();
}
cin.close();
char[] results = getNTimesCharacter(nValue, strings);
System.out.print("[");
for (int i = 0; i < results.length; i++) {
if (i == 0) {
System.out.print(results[i]);
} else {
System.out.print(" " + results[i]);
}
}
System.out.print("]");
}
// 待实现函数,在此函数中填入答题代码
private static char[] getNTimesCharacter(int nValue, String[] strings) {
//System.out.println("strings.length = " + strings.length);
//将符合要求的字符存入set集合,并放入list中
List<HashSet<Character>> list = new ArrayList<>();
//遍历字符串数组
for(int i = 0 ; i<strings.length;i++ ){
//获取数组元素,字符串
String str = strings[i];
Map<Character,Integer> map = new HashMap<Character, Integer>();
HashSet<Character> set = new HashSet();
//list.add(set);
//遍历字符串
for(int j=0 ; j<str.length();j++){
//将字符串字符作为K,相同字符数量作为V,存入map
if(map.containsKey(str.charAt(j))){
Integer value = map.get(str.charAt(j))+1;
map.put(str.charAt(j),value);
}else{
map.put(str.charAt(j),1);
}
//如果字符串字符的数量大于等于限定值,就将其放入Set中
if(map.get(str.charAt(j)) >= nValue){
set.add(str.charAt(j));
}
}
//将Set集合放入list
list.add(set);
}
HashSet<Character> hashSet0 = list.get(0);
Map<Character,Integer> mapEnd = new HashMap<Character, Integer>();
//遍历第一个set集合
hashSet0.forEach(a -> {
//将第一个set中的元素放入map
mapEnd.put(a,1);
for (int i = 1; i < list.size(); i++) {
//获取其他set集合
HashSet<Character> hashSet1 = list.get(i);
//如果其他set集合中存在第一个set中的元素,则元素数量加一
if (hashSet1.contains(a))
mapEnd.put(a ,mapEnd.get(a)+1) ;
}
});
//筛选出符合条件的字符
List<Character> lists = new ArrayList<>();
mapEnd.forEach((k,v)->{
if (v==list.size()){
lists.add(k);
}
});
//将筛选出符合条件的字符放入char[]
char[] cha = new char[lists.size()];
for (int i = 0; i < lists.size(); i++) {
cha[i]=lists.get(i);
}
return cha;
}
}