首页 > 解决方案 > 如何解决这个 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;
    }

但是使用下面提供的代码肯定更有效。感谢贡献者!

标签: javamethodsencode

解决方案


只更新一行

hm.put(raw[i], code_words[raw[i].charAt(0)-'a']);

推荐阅读