【发布时间】:2020-11-07 23:19:32
【问题描述】:
问题链接:https://codingbat.com/prob/p238573
要求:
编写一个函数,将raw 中的单词替换为code_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中的第一个 unassigned 单词
所以我将代码更新为:
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"} 和代码字= {“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;
}
但是使用下面提供的代码肯定更有效。感谢贡献者!
【问题讨论】: