一、题目
二、思路(自己)
- 先将paragraph中所有字母小写,然后将单词分开进行存储到treemap中,单词作为键,出现次数作为值,最后再从高到低判断键是否在banned数组中。
class Solution { public String mostCommonWord(String paragraph, String[] banned) { String s1=paragraph.toLowerCase(); String[] s2=s1.split("[!?',;. ]"); String[] s22=deleteNull(s2); Map<String,Integer> m1=new TreeMap<>(); for(String s3:s22){ if(m1.containsKey(s3)){ m1.put(s3,m1.get(s3)+1); continue; } m1.put(s3,1); } Comparator<Map.Entry<String,Integer>> compare=new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o2.getValue()-o1.getValue(); } }; List<Map.Entry<String,Integer>> list=new ArrayList<>(m1.entrySet()); Collections.sort(list,compare); List<String> list1=Arrays.asList(banned); for(Map.Entry<String,Integer> m2:list){ if(list1.contains(m2.getKey())) continue; else return m2.getKey(); } return "1"; } public static String[] deleteNull(String[] s1){ List<String> list1= Arrays.asList(s1); List<String> list2=new ArrayList<>(); for(String s3:list1){ if(s3=="") continue; list2.add(s3); } return list2.toArray(new String[list2.size()]); } }
- 后面的方法deleteNull用于删除生成单词数组中的空白字符,我也不清楚为什么我明明已经把空格分离了还是会有空白字符,于是写了这个方法用来消除。
三、题解(官方)
官方用的不是先分解字符串为单词,而是通过扫描进行计数。
class Solution {
public String mostCommonWord(String paragraph, String[] banned) {
Set<String> bannedSet = new HashSet<String>();
for (String word : banned) {
bannedSet.add(word);
}
int maxFrequency = 0;
Map<String, Integer> frequencies = new HashMap<String, Integer>();
StringBuffer sb = new StringBuffer();
int length = paragraph.length();
for (int i = 0; i <= length; i++) {
if (i < length && Character.isLetter(paragraph.charAt(i))) {
sb.append(Character.toLowerCase(paragraph.charAt(i)));
} else if (sb.length() > 0) {
String word = sb.toString();
if (!bannedSet.contains(word)) {
int frequency = frequencies.getOrDefault(word, 0) + 1;
frequencies.put(word, frequency);
maxFrequency = Math.max(maxFrequency, frequency);
}
sb.setLength(0);
}
}
String mostCommon = "";
Set<Map.Entry<String, Integer>> entries = frequencies.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
String word = entry.getKey();
int frequency = entry.getValue();
if (frequency == maxFrequency) {
mostCommon = word;
break;
}
}
return mostCommon;
}
}