资源引用:
今日小记:
1.灵活使用TreeMap解决按字典排序的问题
2.使用StringBuilder构造字符串,注意重置复用
稀土掘金-358.单词出现频率统计(358.单词出现频率统计)
题目分析:
给定一个英文句子s,需统计其中的全部单词及其出现字数,最终按照字母顺序将统计结果进行排序,并按照"word:count"的格式添入List<String>,最终返回该List。
解题重点:
- 统计单词及其频次,可使用哈希映射,即Map来实现。
- 观察样例可发现,“字母顺序”即按照ASCII码的顺序对各个单词(包括数字)进行排序。
由此二点可知,可使用默认按照字典顺序(字母顺序)进行排序的TreeMap来进行对单词及其频次的统计,只需按照遍历TreeMap的顺序输出到List即可。
解题思路:
- 以空格为间隔符,依次读出全部单词并用TreeMap记录其频次
- 按照遍历键的顺序,借助StringBuilder构造"word:count"格式的字符串,将单词及其频次输出到List中
- 最终返回该List
总结反思:
时刻谨记:循环遍历是否确保处理了首尾特殊情况。
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.TreeMap;
public class Main {
public static List<String> solution(String s) {
List<String> resList = new ArrayList<>();
Map<String, Integer> map = new TreeMap<>();
StringBuilder sb = new StringBuilder();
/* 1.读取单词并统计其频次 */
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') {
String word = sb.toString();
map.put(word, map.getOrDefault(word, 0) + 1);
sb.setLength(0);
} else {
sb.append(s.charAt(i));
}
}
if (sb.length() > 0) {// 处理句子末尾的单词
String word = sb.toString();
map.put(word, map.getOrDefault(word, 0) + 1);
sb.setLength(0);
}
/* 2.按照遍历键的顺序构造符合格式的字符串列表,返回统计结果 */
for (String word : map.keySet()) {
sb.append(word + ':' + map.get(word));
resList.add(sb.toString());
sb.setLength(0);
}
return resList;
}
public static void main(String[] args) {
System.out.println(solution("New to Python or choosing between Python 2 and Python 3 Read Python 2 or Python 3")
.equals(List.of("2:2", "3:2", "New:1", "Python:5", "Read:1", "and:1", "between:1", "choosing:1", "or:2",
"to:1")));
System.out.println(solution("hello world hello python").equals(List.of("hello:2", "python:1", "world:1")));
System.out.println(solution("the quick brown fox jumps over the lazy dog")
.equals(List.of("brown:1", "dog:1", "fox:1", "jumps:1", "lazy:1", "over:1", "quick:1", "the:2")));
}
}
稀土掘金-298.素数元素的统计(298.素数元素的统计)
题目分析:
“素数元素”的定义:一种元素,若其满足在数组中的出现次数为素数,且元素值本身也为素数,才叫做素数元素。
本题要求给定的整型序列a种的素数元素个数。
解题重点:
- 显然可以借助Map对数组中的素数及其频次进行统计,再从中筛选出符合条件的个数。
- 素数的判断:对于一个大于1的整数,从2开始,到该数的平方根,遍历其是否为该数的因数,若均不为因数,则该数是素数。
解题思路:
- 遍历整形序列a中的每一个数,判断其是否为素数,若为素数,则将其添入Map并统计其频次
- 按值遍历Map,判断每一个值是否为素数,若是素数,则结果得数+1。
- 最终返回结果。
import java.util.*;
public class Main {
public static int solution(List<Integer> a) {
Map<Integer, Integer> map = new HashMap<>();
int res = 0;
/*1. */
for (int num : a) {
if (isPrime(num)) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
}
/*2. */
for (int value : map.values()) {
if (isPrime(value)) {
res++;
}
}
return res;
}
public static boolean isPrime(int num) {
if (num <= 1) {
return false;
}
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
public static void main(String[] args) {
System.out.println(solution(Arrays.asList(1, 2, 3, 2, 5, 7, 7, 7, 5)) == 3);
System.out.println(solution(Arrays.asList(1, 4, 6, 8, 10, 12)) == 0);
System.out.println(solution(Arrays.asList(3, 3, 3, 5, 5, 5, 5)) == 1);
}
}
标签:map,word,List,单词,素数,298,sb,20,打卡
From: https://blog.csdn.net/csy031117/article/details/145258611