java - 如何解决这个 CodingBat 编码器问题?
问题描述
问题链接:https ://codingbat.com/prob/p238573
要求:编写一个函数,将 in 中的单词替换为 inraw
中的单词,以便为 incode_words
中的每个单词的第一次出现raw
分配 中的第一个未分配的单词code_words
。
编码器(["a"], ["1", "2", "3", "4"]) → ["1"]
编码器(["a", "b"], ["1", "2", "3", "4"]) → ["1", "2"]
编码器([“a”,“b”,“a”],[“1”,“2”,“3”,“4”])→[“1”,“2”,“1”]
我尝试了两种不同的解决方案,但它仍然表明我的功能不适用于“其他测试”
第一的:
public String[] encoder(String[] raw, String[] code_words) {
HashMap<String, String> hm = new HashMap<String, String>();
for (int i=raw.length - 1; i >= 0; i--) {
hm.put(raw[i], code_words[i]);
}
String [] finalarray = new String[raw.length];
for (int i=0; i < raw.length; i++) {
String x = hm.get(raw[i]);
finalarray[i] = x;
}
return finalarray;
}
所有测试都很好,但“其他测试”失败了
所以我认为是因为要求中的这一行,每个单词的第一次出现
raw
被分配了第一个未分配的单词code_words
所以我将代码更新为:
public String[] encoder(String[] raw, String[] code_words) {
HashMap<String, String> hm = new HashMap<String, String>();
for (int i=0; i < raw.length; i++) {
String word = raw[i];
String value = code_words[i];
if (!hm.containsKey(word)) {
if (hm.containsValue(value)) {
for (int i1=0; i1 < code_words.length; i1++) {
value = code_words[i1];
if (!hm.containsValue(value)) {
hm.put(word, value);
break;
}
}
}
else {
hm.put(word, value);
}
}
}
String[] finalarray = new String[raw.length];
for (int i=0; i < raw.length; i++) {
String x = hm.get(raw[i]);
finalarray[i] = x;
}
return finalarray;
}
但它失败了,我不知道为什么会这样。
编辑: 我的(第二个)代码的问题是:如果我们假设 raw = {"a", "a", "b", "d"} 和 code words = {"1", "2", "3" , "4"}
我的代码会将字母“a”分配给“1”,将“b”分配给“3”,将d分配给“4”,即使它是第一个未分配的字母,也会使“2”未分配
我提供的代码做了一些调整
public String[] encoder(String[] raw, String[] code_words) {
HashMap<String, String> hm = new HashMap<String, String>();
for (int i=0; i < raw.length; i++) {
String word = raw[i];
int assigned = 0;
String value = code_words[assigned];
if (!hm.containsKey(word)) {
if (hm.containsValue(value)) {
for (int i1=0; i1 < code_words.length; i1++) {
value = code_words[i1];
if (!hm.containsValue(value)) {
hm.put(word, value);
assigned++;
break;
}
}
}
else {
hm.put(word, value);
assigned++;
}
}
}
String[] finalarray = new String[raw.length];
for (int i=0; i < raw.length; i++) {
String x = hm.get(raw[i]);
finalarray[i] = x;
}
return finalarray;
}
但是使用下面提供的代码肯定更有效。感谢贡献者!
解决方案
只更新一行
hm.put(raw[i], code_words[raw[i].charAt(0)-'a']);
推荐阅读
- c++ - 模板指针作为成员
- testing - 在具有 `MAIN` 定义的模块上使用 `use-ok` 进行测试
- php - 这个 PHP CURL 脚本(集成 Foursquare API)有什么问题?
- s4sdk - 无法获取元数据:无法执行 OData 元数据请求
- raku - 如何正确增加 Any?
- java - 如何使用 Java 客户端从 yaml 创建通用 Kubernetes 对象
- javascript - 如何在帖子列表中首先添加新帖子?
- r - R终端中的中欧(克罗地亚)字符
- struct - 使用结构存储对非复制值的引用
- javascript - 如果数组包含来自另一个数组的项目,则 Firestore 集合