算法每一题,成长每一天~
C0E6 猜字谜
真题链接:【持续更新】2024华为 OD 机试E卷 机考真题库清单(全真题库)
思路
题干依然是不太清晰。比如 woood 和 wodo 去重后算一致吗?去重与重排序能同时满足还是只能分别满足?(先按简单方式做!万一测例通过了呢)
Java
下面是能同时满足两个条件的代码实现:
import java.util.*;
import java.util.stream.Collectors;
/**
* 猜字谜
*/
public class C0E6 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[] mStrings = in.nextLine().split(",");
String[] dStrings = in.nextLine().split(",");
// 处理谜面
Set<String> mSet = convert(mStrings, null);
// 处理谜底(最后要打印谜底,所以谜底需要保留映射)
Map<String, String> dMap =new HashMap<>();
Set<String> dSet = convert(dStrings, dMap);
mSet.retainAll(dSet); // 保留存在的元素
String print = mSet.stream()
.map(dMap::get) // 转称谜底打印
.collect(Collectors.joining(","));
System.out.println(print);
}
public static Set<String> convert(String[] mStrings, Map<String, String> map) {
Set<String> mList = new HashSet<>(mStrings.length);
for (String str : mStrings) {
if (str.isEmpty()) {
continue;
}
// 字符串去重排序
TreeSet<String> treeSet =
new TreeSet<>(Arrays.asList(str.split("")));
// 组成新字符串
String trim = String.join("", treeSet).trim();
mList.add(trim);
if (map != null) {
map.put(trim, str); // 记录谜底原字符串 与新字符串 的映射关系
}
}
return mList;
}
}
总结
1、题目不清楚时,先按思路清晰的简单的方式做。特别是另一种情况一时想不清楚时!
2、TreeSet 用于去重+排序。
3、retainAll() 是个好方法,区别于 removeAll()。
xx:只能分别满足其一的情况,暂时没想到,题干也不清晰.:去重是只能连续的去重,还是任意位置去重?比如 woood和 wodooo,去重后是一样的吗?就这样吧~
算法要多练多练多练!!