首页 > 解决方案 > 为什么以下问题的所有测试用例都没有通过?

问题描述

我试图解决的编码问题就是这个。我试图解决但并非所有测试用例都通过了我无法找到可能的原因?

识别可能的单词:Bakshi 侦探在解决一个案件时偶然发现了一封信,其中有很多单词缺少一个字符,即单词中的一个字符被下划线替换。例如“Fi_er”。他还发现了薄纸条,上面有一组用冒号分隔的单词,例如“Fever:filer:Filter:Fixer:fiber:fiber:tailor:offer”。他能从那张薄纸上判断出少了一个字的单词是其中一个可能的单词。侦探 Bakshi 找到您(计算机程序员)寻求帮助,以识别每个不完整单词的可能单词。

您应该编写一个函数来识别一组可能的单词。函数 identifyPossibleWords 将两个字符串作为输入,其中,

input1 包含不完整的单词,input2 是包含一组用冒号分隔的单词的字符串。

该函数预计会从 input2 中找到所有可能的单词,这些单词可以替换不完整的单词 input1,并以下面建议的格式返回结果。

示例 1 -

input1 = “Fi_er” input2 = “Fever:filer:Filter:Fixer:fiber:fiber:tailor:offer”</p>

输出字符串应返回为“FILER:FIXER:FIBER”注意——</p>

输出字符串应包含可替换输入 1 中不完整单词的所有可能单词的集合 输出字符串中的所有单词应以大写形式存储 输出字符串中的所有单词应按照它们在输入 2 中出现的顺序出现,即在上面的例子中,我们有 FILER 后跟 FIXER 后跟 FIBER。在 input2 中搜索 input1 时,忽略字母的大小写,即“Fi_er”与“filer”、“Fixer”以及“fiber”匹配。重要提示:如果 input2 中没有任何单词可以替代 input1,则输出字符串应包含字符串“ERROR-009” 假设:

Input1 将仅包含一个单词,其中仅 1 个字符被下划线“_”替换 Input2 将包含一系列用冒号分隔的单词 Input2 将不包含除下划线和字母字符之外的任何其他特殊字符。

我对这个问题的解决方案是:

 import java.io.*;
import java.util.*;
class UserMaincode
{
   public String indentifyPossibleWords(String input1, String input2)
{
       input1=input1.toUpperCase();
       input2=input2.toUpperCase();

       String arr1[]=input1.split("_");
       String arr2[]=input2.split(":");
       StringBuilder sb=new StringBuilder("");
       for(int i=0;i<arr2.length;i++){
           if(arr2[i].matches(arr1[0]+"."+arr1[1])){
               sb.append(arr2[i]+":");
           }
       }

       if(sb.length()!=0){
           sb.deleteCharAt(sb.length()-1);
       }

       String s=sb.toString();
       if(s==""){
           return "ERROR-009";
       }
       return s;
}
}

但是一些隐藏的测试用例没有通过。问题可能出在哪里。

我从网上找到了一个通过所有测试用例的代码。请参阅此链接。

https://www.csinfo360.com/2020/01/cracking-coding-interview-step-11.html

标签: javaregexstringstringbuildertestcase

解决方案


有很多方法可以达到上述问题中预期的结果。自从; 您regex在标签中提到过;因此,我将尝试使用正则表达式提供可能的解决方案。虽然; 这也可以在没有它们的情况下实现。

建议的程序:


 1. Create a regex from the given input1 i.e. replace the _ present anywhere inside input1 with regex dot (.) meta-character.
 2. Split the string based on :.
 3. Keep a count of length of spliced array of input2.
 4. for each item in input2:
      5. match using the regex formed in step 1
            If successful
              append to upper-cased result.
            else:
                 increment the counter.
6. if counter == length of spliced array i.e. no match found
    return "ERROR-009"
   else   
    return the appended result.

上述程序在java中的实现:

import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
    public static void main(String[] args) {
        System.out.println(identifyPossibleWords("Fi_er", "Fever:filer:Filter:Fixer:fiber:fibre:tailor:offer"));
//      Fever:fiqqer:Filter:Fixxer:fibber:fibre:tailor:offer return ERROR-009
    }

    public static String identifyPossibleWords(String input1, String input2){
        input1 = input1.replace("_", ".");
        StringBuilder sb = new StringBuilder();
        int counter = 0;
        int lengthOfInput2 = input2.split(":").length;
        final Pattern pattern = Pattern.compile(input1, Pattern.CASE_INSENSITIVE);
        for(String str: input2.split(":")){
            Matcher matcher = pattern.matcher(str);
            if(matcher.matches())sb.append(matcher.group(0).toUpperCase() + "\n"); // \n to print in new line. You can edit the code accordingly.
            else counter++;
        }
        if(counter == lengthOfInput2)return "ERROR-009";
        return sb.toString();
    }
}

您可以在此处找到上述实现的示例运行。


推荐阅读