1、小红背单词
小红每天都要背单词,然后她会把每天记住了多少单词记录下来,并在小红书上打卡。当小红背单词时,如果她已经记住了 i 个单词,且背了一个没有记住的新单词 i+1 次,则她就会记住这个新单词。
例如,当她按顺序背 [“you“、“thank”、“thank”] 时,她第一次背单词 “you” 时她就能记住 “you”。而由于她已经记住了一个单词,所以需要背两次 “thank” 才能记住 "thank”。现在你知道了小红背单词的顺序,请你求出小红今天记住了多少个单词。
输入描述:
第一行一个整数 n(1<=n<=10000)。接下来 n 行,每行一个字符串,保证每个字符串长度不超过 10。
输出描述:
输出一个整数,表示她记住了多少个单词。
样例输入:
5
you
thank
queue
queue
thank
样例输出
2
提示:
小红先记住了单词"you”,又因为背了两次"queue"于是记住了单词"queue”,由于已经记住了两个单词,所以背两次"thank"还不能让小红记住。
题解——模拟
HashMap记录每个单词的记的次数,同时用Set记录已经背过的单词,已经背过的单词不计入
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String[] s = new String[n];
in.nextLine();
for(int i = 0; i < n; i++){
s[i] = in.nextLine();
}
//HashMap记录每个单词的次数
HashMap<String, Integer> map = new HashMap<>();
//Set记录已经背过的单词,已经背过的单词不计入
HashSet<String> set = new HashSet<>();
int sum = 0;
for(int i = 0; i < n; i++){
//已经背过的单词不计入
if(set.contains(s[i])){
continue;
}
//HashMap记录每个单词的次数
map.put(s[i], map.getOrDefault(s[i],0) + 1);
//当前记的单词数大于该背的单词数了,记为背过
if(map.get(s[i]) > sum){
sum++;
set.add(s[i]);
}
}
//System.out.println(map);
//System.out.println(set);
System.out.println(sum);
}
}
2、小红的回文串
小红有一个字符串,她可以进行以下操作:
-
拆分。把 ‘w’ 拆成 2 个 ‘v’,‘m’ 拆成 2个 ‘n’。
-
轴堆成。把 ‘b’ 轴对称成 ‘d’,‘p’ 轴对称成 ‘q’,反之亦然。
-
翻转。把 ‘b’ 反转成 ‘q’,把 ‘d’ 翻转成 ‘p’,把 ‘n’ 翻转成 ‘u’
经过若干次操作,小红想知道这个字符串能不能变成回文串。
输入描述:
第一行输入一个整数 T(1<=T<= 1 0 4 10^4 104)表示询问次数
接下来 T 行,每行输入一个字符串表示询问。
所有字符串长度之和不超过 1 0 5 10^5 105。
输出描述:
输出 T 行,每行输出 “YES” 或 “NO” 表示是否可以变成回文串。
样例输入:
5
Wovv
bod
pdd
moom
lalalai
样例输出
YES
YES
YES
YES
NO
题解——模拟
变成回文串思路:
- bdqp,统一转换为 b
- w,转为 vv
- n,转为 u
- m,转为 uu
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String[] s = new String[n];
in.nextLine();
for (int i = 0; i < n; i++) {
s[i] = in.nextLine();
}
String[] ans = new String[n];
Arrays.fill(ans, "NO");
int index = 0;
for (String str : s) {
//使用一个StringBuilder转换字符串s
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
// 如果为bdqp,统一转换为b
if (c == 'b' || c == 'd' || c == 'q' || c == 'p') {
sb.append('b');
}
// 如果为w,转为vv
else if (c == 'w') {
sb.append('v').append('v');
}
// 如果为n,转为u
else if (c == 'n') {
sb.append('u');
}
// 如果为m,转为uu
else if (c == 'm') {
sb.append('u').append('u');
}
else {
sb.append(c);
}
}
String s1 = sb.toString();
//对每一个字符串首尾开始遍历判断是否回文串
int i = 0, j = s1.length() - 1;
boolean flag = true;
while (i < j) {
if (s1.charAt(i) != s1.charAt(j)) {
flag = false;
}
i++;
j--;
}
if (flag) {
ans[index] = "YES";
}
index++;
}
//输出结果
for (String x : ans) {
System.out.println(x);
}
}
}