-3

所以我正在研究java codingbat,这就是问题:

给定一个字符串,在给定字符串的开头和结尾寻找一个镜像(向后)字符串。
换句话说,在给定字符串的开头有零个或多个字符,并且在字符串的最后以相反的顺序(可能重叠)。

例如: 字符串“abXYZba”的镜像端为“ab”。mirrorEnds("abXYZba") → "ab" mirrorEnds("abca") → "a" mirrorEnds("aba") → "aba" 。

我的代码通过了所有测试,但未指定的其他测试除外。我不知道它有什么问题。

  public String mirrorEnds(String string) {
  String input = string, mirror = "";
            int length = string.length();


            for (int n = 0; n < (length+1) / 2; n++) {


                if (input.charAt(n) != input.charAt(length - n - 1)) {

                    break;
                }else if(length%2 == 1 && n == (length - 1)/2){
//                    System.out.println("length/2 = " );

                    return input;
                } 
                else {
                    mirror += input.charAt(n);
                }
            }

            return  mirror;
}
4

5 回答 5

1

您不需要遍历整个单词是正确的,但是您的逻辑比它需要的更复杂,这使得查找和解决问题变得更加困难。测试失败的根本原因在于最后一条return语句。string如果循环完成而没有中断,它必须返回。break;您可以通过更改为return mirror;并将最后一个更改为return mirror;来修复您的代码return input;

失败的测试是这样的:

 mirrorEnds("abba") -> "abba"

可以像这样创建更简单的代码版本:

public String mirrorEnds(String string) {
    int len =  string.length();
    for (int i=0; i < len/2; ++i)
        if (string.charAt(i) != string.charAt(len - 1 - i))
            return string.substring(0, i);
    return string;
}
于 2013-12-19T01:46:58.347 回答
0

我尝试的第一个测试是使用"abba"失败的字符串。它返回 ab,而不是 abba。正如 femtoRgon 所提到的,您不会遍历整个单词,这有时可能是必要的。femtoRgon 的解决方案有效,并且采用了稍微不同的方法来遍历单词,如下所示:

public String mirrorEnds(String string) {
    boolean matches = true;
    StringBuilder mirrorEnd = new StringBuilder();
    int index = 0;
    while (matches && index < string.length()) {
        if (string.charAt(index) == string.charAt(string.length() - index - 1))
            mirrorEnd.append(string.charAt(index));
        else
            matches = false;
        index++;
    }
    return mirrorEnd.toString();
}
于 2013-01-17T19:13:08.607 回答
0

mirrorEnds(“阿巴”)?

无论如何,我相信你可以想出一个比“一些奇怪的东西”更好的问题名称......

于 2013-01-17T18:51:59.507 回答
0

由于您在循环终止条件中将 n 除以 2,因此它将在单词中途结束。这足以说明这个词是回文,但不足以正确构建您的输出。您有一个条件处理回文,其中包含奇数个字母,但不是偶数个字母。我相信失败的测试将采用“abba”的形式,我相信你所拥有的将返回“ab”,而不是“abba”。

如果您将循环更改为:

for (int n = 0; n < length; n++) {

我相信它应该做你想做的事。这也使短路情况变得不必要,因此:

        for (int n = 0; n < length; n++) {
            if (input.charAt(n) != input.charAt(length - n - 1)) {
                break;
            } 
            else {
                mirror += input.charAt(n);
            }
        }
于 2013-01-17T19:05:25.907 回答
0
public String mirrorEnds(String string) {
  String comp="";
  for(int i=0; i<string.length(); i++){
   if(string.charAt(i)==string.charAt(string.length()-(i+1)))
    comp= comp+ string.charAt(i);
   else break;
  }
  return comp;
}
于 2015-08-17T09:34:50.577 回答