华为OD机试 - 匿名信(Java 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
电视剧《分界线Q》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己,于是将报刊上的字减下来,剪拼成匿名信。
现在一名举报人,希望借鉴这部片段,使用英文报刊为范本来剪拼举报信。
但为了增加文章的混淆程度,尽量避免每个单词中字母数量一致即可,不关注每个字母的顺序。
解释:单词n允许抄袭过n的字母组合。
报纸代表newspaper,匿名信代表anonymousLetter,求报纸内容是否可以拼成匿名信。
二、输入描述
第一行newspaper内容,包括1N个字符,并且空格分开
第二行anonymousLetter内容,包括1N个字符,并且空格分开。
newspaper和anonymousLetter的字符串中均为英文字母组成,且每个字母只能使用一次;
newspaper内容中的每个字符中字母顺序可以任意调整,但必须保证字符串的完整性(每个字符串不能有多余字母)
1 < N < 100,
1 <= newspaper.length,anonymousLetter.length <= 104
三、输出描述
如果报纸可以拼成匿名信返回true,否则返回false
四、测试用例
测试用例1:
1、输入
ab cd
ab
2、输出
true
3、说明
测试用例2:
1、输入
ab ef
aef
2、输出
false
3、说明
五、解题思路
- 读取输入,包括报纸内容和匿名信内容。
- 将报纸和匿名信中的每个单词进行字母排序,得到其“规范形式”。
- 例如,单词“ab”排序后仍为“ab”,单词“aef”排序后为“aef”。
- 统计报纸中每种规范形式的单词出现次数,存入一个哈希映射 newspaperMap 中。
- 统计匿名信中每种规范形式的单词出现次数,存入另一个哈希映射 letterMap 中。
- 遍历匿名信中的每种规范形式,检查报纸中是否有足够数量的对应单词。
- 如果报纸中某种规范形式的单词数量少于匿名信中需要的数量,则返回 false。
- 如果所有匿名信中的单词都在报纸中有足够的对应单词,则返回 true。
六、Java算法源码
public class OdTest {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取报纸内容,并按空格分割成单词数组String newspaperLine = scanner.nextLine().trim();String[] newspaperWords = newspaperLine.split("\\s+");// 读取匿名信内容,并按空格分割成单词数组String letterLine = scanner.nextLine().trim();String[] letterWords = letterLine.split("\\s+");// 关闭扫描器scanner.close();// 计算报纸中每种规范形式的单词出现次数Map<String, Integer> newspaperMap = new HashMap<>();for (String word : newspaperWords) {String sortedWord = sortLetters(word);newspaperMap.put(sortedWord, newspaperMap.getOrDefault(sortedWord, 0) + 1);}// 计算匿名信中每种规范形式的单词出现次数Map<String, Integer> letterMap = new HashMap<>();for (String word : letterWords) {String sortedWord = sortLetters(word);letterMap.put(sortedWord, letterMap.getOrDefault(sortedWord, 0) + 1);}// 检查报纸中是否有足够的单词来组成匿名信boolean canForm = true;for (Map.Entry<String, Integer> entry : letterMap.entrySet()) {String sortedWord = entry.getKey();int requiredCount = entry.getValue();int availableCount = newspaperMap.getOrDefault(sortedWord, 0);if (availableCount < requiredCount) {canForm = false;break;}}// 输出结果System.out.println(canForm ? "true" : "false");}/*** 将单词中的字母按字母序排序,并返回排序后的字符串** @param word 原始单词* @return 排序后的单词*/private static String sortLetters(String word) {char[] chars = word.toCharArray();Arrays.sort(chars);return new String(chars);}
}
七、效果展示
1、输入
ab bcd ef
cbd fe
2、输出
true
3、说明
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。