一段时间以来,我一直在测试其他方法,这就是我得到的。我只是不知道如何解决这个问题。
/** Return true iff s has an odd number of characters and
* the substring before the middle character equals the substring
* after it.
* Examples: For s = "" return false
* For s = "b" return true
* For s = "xbx" return true
* For s = "xxxx" return false
* For s = "hellohello" return false
* For s = "hello!hello" return true */
public static boolean isDoubled(String s) {
// TODO 1. There is no need for a loop. Do not use a loop.
// In all methods, use s1.equals(s2) and NOT s1 == s2 to test
// equality of s1 and s2.
int midLen = s.length() / 2;
if (midLen == 0) return false;
String[] parts = {s.substring(0, midLen - 1), s.substring(midLen + 1)};
String part1 = parts[0];
String part2 = parts[1];
if ((s.length() % 2 == 0) && (part1.equals(part2))) {
return true;
}
return false;
}
答案 0 :(得分:1)
两个简单的错误:
在if-statement
中,如果要确定长度不是,则长度是否为偶数。 (将(s.length() %2===0)
更改为!(s.length() %2 == 0)
并且substring
函数不包含在内,因此您想将s.substring(0, mid-1)
更改为s.substring(0, mid)
(从docs:“ 子字符串开始于指定的beginIndex,并扩展到索引endIndex-1处的字符。” “)
此外,您无需将array
的两个部分放入变量中。您可以简单地将它们进行比较,例如:
parts[0].equals(parts[1])
答案 1 :(得分:1)
当您将两个索引(a,b)传递给子字符串方法时,该方法包括索引,但不包括索引b。从数学上讲,它是[a,b)。如果考虑字符串“ hello!hello”,则mid将是索引5。当您说-
String[] parts = {s.substring(0, midLen - 1), s.substring(midLen + 1)};
您将获得的两个部分是
s.substring(0, 4) //this gets you the string "hell"
s.substring(6) //this gets you the string "hello"
显然,它们不匹配。导致错误的对等。
您需要做的是一点零钱-
String[] parts = {s.substring(0, midLen), s.substring(midLen + 1)};
答案 2 :(得分:0)
使用substring
函数有误:
public static boolean isDoubled(String s) {
if (s.length() % 2 == 0)
return false;
if (s.length() == 1)
return true;
int mid = s.length() / 2;
return s.substring(0, mid).equals(s.substring(mid + 1));
}