尝试在一组三个字符串中查找中间单词时程序打印"null"



问题:

给定3个单词w1、w2和w3作为输入,输出字典中介于两者之间的单词。不使用任何字符串函数

public String middleWord(String word1,String word2,String word3){
      String str="";
      for(int i=0;(i<word1.length()||i<word2.length()||i<word3.length());i++){
      char ch1=word1.charAt(i);
      char ch2=word2.charAt(i);
      char ch3=word3.charAt(i);
      if(ch1<=ch2 && ch2<=ch3)
      str=str+ch2;
      else if(ch2<=ch1 && ch1<=ch3)
      str=str+ch1;
      else if(ch1<=ch3 && ch3<=ch2)
      str=str+ch3;
      }
      return str;
   }

当我运行代码时,一些测试用例返回null,该怎么办?

Testcase |  Pass/Fail  |     Parameters      | Actual Output | Expected Output
   #1    |     Pass    | 'cat' 'bat' 'rat'   |    cat        |  cat
   #2    |     Fail    | 'go' 'went' 'gone'  |    null       |  gone
public String middleWord(String word1,String word2,String word3){     
   int i=0;
   int j=0;
   int k=0;
    char ch1= 'u0000';
    char ch2= 'u0000';
    char ch3= 'u0000';
 while(i<word1.length()||j<word2.length()||k<word3.length()){
        if(i<word1.length()){
        ch1=word1.charAt(i++);
        }
        if(j<word2.length()){
        ch2=word2.charAt(j++);
        }
        if(k<word3.length()){
       ch3=word3.charAt(k++);
        }
        if(ch2>ch1&&ch2<ch3)
         return word2;
        if(ch1>ch2&&ch1<ch3)
         return word1;
        if(ch3>ch1&&ch3 < ch2)
         return word3;
         if(ch1==ch2){
             i++;
             j++;
             while(i<word1.length()||j<word2.length()){
                if(i<word1.length()){
                ch1=word1.charAt(i);
                i++;
                 }
             if(j<word2.length()){
               ch2=word2.charAt(j);
               j++;
             }
             if(ch2>ch1)
             return word2;
             else
              return word1;
            }
           }
        else if(ch2==ch3){
            j++;
            k++;
            while(j<word2.length()||k<word3.length()){
              if(j<word2.length()){
               ch1=word1.charAt(j);
               j++;
               }
              if(k<word3.length()){
               ch2=word2.charAt(k);
                k++;
              }
             if(ch2>ch1)
             return word3;
             else
             return word2;
            }
          }
        else if(ch1==ch3){
            i++;
            k++;
            while(i<word1.length()||k<word3.length()){
                if(i<word1.length()){
                 ch1=word1.charAt(i);
                 i++;
                }
             if(k<word3.length()){
                ch2=word3.charAt(k);
                k++;
             }
             if(ch2>ch1)
             return word3;
             else
             return word1;
            }
         }
      }
   return "bad";   
}  

此代码通过了所有测试用例,没有在字符串中使用任何构建函数。

给定3个单词w1、w2和w3作为输入,输出字典中介于两者之间的单词。

public static String middleWord(String word1, String word2, String word3) {
    int i=0;
   int j=0;
   int k=0;
    char ch1= 'u0000';
    char ch2= 'u0000';
    char ch3= 'u0000';
 while(i<word1.length()||j<word2.length()||k<word3.length()){
        if(i<word1.length()){
        ch1=word1.charAt(i++);
         }
        if(j<word2.length()){
        ch2=word2.charAt(j++);
         }
        if(k<word3.length()){
       ch3=word3.charAt(k++);
        }
        if(ch2>ch1&&ch2<ch3)
         return word2;
        if(ch1>ch2&&ch1<ch3)
         return word1;
        if(ch3>ch1&&ch3 < ch2)
         return word3;
         if(ch1==ch2){
             i++;
             j++;
             String res=compare(word1,word2,i,j);
             return res;
        }
        else if(ch2==ch3){
            j++;
            k++;
            String res=compare(word2,word3,j,k);
              return res;
        }
        else if(ch1==ch3){
            i++;
            k++;
            String res=compare(word1,word3,i,k);
              return res;
         }
 }
   return "bad";
}  
public String compare(String str1,String str2,int n1,int n2){
   char ch1= 'u0000';
    char ch2= 'u0000';
while(n1<str1.length()||n2<str2.length()){
                if(n1<str1.length()){
                 ch1=str1.charAt(n1);
                 n1++;
                }
             if(n2<str2.length()){
                ch2=str2.charAt(n2);
                n2++;
             }
             if(ch2>ch1)
             return str2;
             else
             return str1;
            }
            return "poor";
}
 }

我通过制作一个函数来缩短我的程序,该函数比较给定字符串的两个字符。当任意两个字符相同时,我们使用此函数来选择字典中哪个字符第一,哪个字符第二。

如果我没有误解你想要做的事情,我认为这些简单的更改会起作用。。。

public static String middleWord(String word1, String word2, String word3) {
    for (int i = 0; (i < word1.length() || i < word2.length() || i < word3.length()); i++) {
        char ch1 = 10000;
        char ch2 = 10000;
        char ch3 = 10000;
        if(word1.length() > i){
            ch1 = word1.charAt(i);
        }
        if(word2.length() > i){
            ch2 = word2.charAt(i);
        }
        if(word3.length() > i){
            ch3 = word3.charAt(i);
        }
        if (ch1 <= ch2 && ch2 <= ch3) {
            return word2;
        } else if (ch2 <= ch1 && ch1 <= ch3) {
            return word1;
        } else if (ch1 <= ch3 && ch3 <= ch2) {
            return word3;
        }
    }
    return null;
}

代码中的问题是,您正在连接字符,当您决定哪个是中间词时,只需要返回它。

正如注释中所述,问题中的代码存在以下问题,但没有采取行动:

  • 代码试图构建一个新字符串,但任务是选择一个单词,因此代码从一开始就偏离了目标
  • 代码抛出StringIndexOutOfBoundsException
  • 即使没有,也没有任何代码路径可以使代码返回null

因此,该代码是有缺陷的,并且没有按照描述进行操作。这完全违背了堆栈溢出的最小、完整和可验证原则,尤其是可验证部分。看见https://stackoverflow.com/help/mcve.

同样,试图一次比较一个字母的逻辑也会失败。如果输入是"aa"、"bb"、"ac",那么答案应该是"ac";"ac"<"bb",但如果没有一些主要的状态跟踪,一次比较一个字母是无法检测到这一点的。

假设"不使用任何字符串函数"意味着你不能使用任何内置的函数,你可以写自己的比较。

public static String middleWord(String word1, String word2, String word3) {
    int cmp12 = compareWords(word1, word2);
    int cmp13 = compareWords(word1, word3);
    int cmp23 = compareWords(word2, word3);
    if (cmp12 == 0 || cmp13 == 0 || cmp23 == 0)
        throw new IllegalArgumentException("Found equal words: " + word1 + ", " + word2 + ", " + word3);
    if (cmp12 < 0) { // word1 < word2
        if (cmp23 < 0) // word2 < word3
            return word2; // word1 < word2 < word3
        if (cmp13 < 0) // word1 < word3
            return word3; // word1 < word3 < word2
        return word1; // word3 < word1 < word2
    }
    if (cmp13 < 0) // word1 < word3
        return word1; // word2 < word1 < word3
    if (cmp23 < 0) // word2 < word3
        return word3; // word2 < word3 < word1
    return word2; // word3 < word2 < word1
}
private static final int compareWords(String word1, String word2) {
    for (int i = 0; i < word1.length(); i++) {
        if (i == word2.length())
            return 1; // word1 > word2 (word2 shorter and compared equal until now)
        char ch1 = word1.charAt(i);
        char ch2 = word2.charAt(i);
        if (ch1 < ch2)
            return -1; // word1 < word2
        if (ch1 > ch2)
            return 1; // word1 > word2
    }
    if (word2.length() > word1.length())
        return -1; // word1 < word2 (word1 shorter and compared equal until now)
    return 0; // word1 == word2
}

测试代码:

public static void main(String[] args) {
    System.out.println("Expecting 'sit':");
    System.out.println("  " + middleWord("sat", "soot", "sit"));
    System.out.println("  " + middleWord("soot", "sit", "sat"));
    System.out.println("  " + middleWord("sit", "sat", "soot"));
    System.out.println("Expecting 'cars':");
    System.out.println("  " + middleWord("car", "cart", "cars"));
    System.out.println("  " + middleWord("cart", "cars", "car"));
    System.out.println("  " + middleWord("cars", "car", "cart"));
    System.out.println("Expecting 'ac':");
    System.out.println("  " + middleWord("aa", "ac", "bb"));
    System.out.println("  " + middleWord("ac", "bb", "aa"));
    System.out.println("  " + middleWord("bb", "aa", "ac"));
}

输出:

Expecting 'sit':
  sit
  sit
  sit
Expecting 'cars':
  cars
  cars
  cars
Expecting 'ac':
  ac
  ac
  ac

相关内容

最新更新