CodingBat中的给定任务sameEnds:
给定一个字符串,返回出现在字符串开头和结尾且不重叠的最长子字符串。例如,sameEnds(“abXab”)是“ab”。
sameEnds("abXYab") → "ab"
sameEnds("xx") → "x"
sameEnds("xxx") → "x"
我的解决方案通过了所有测试,除了一个^:
public String sameEnds(String string) {
String substringFront = "";
String substringEnd = "";
String longestSubstring = "";
for (int i = 1; i < string.length() - 1; i++) {
substringFront = string.substring(0, i);
substringEnd = string.substring(i);
if (substringEnd.contains(substringFront)) {
longestSubstring = substringFront;
}
}
return longestSubstring;
}
这里有什么问题?我怎样才能修复它?
迭代到字符串中的最后一个元素,更改循环条件可以解决问题。
for (int i = 1; i < string.length(); i++)
您的代码中有几个问题:
>
在到达最后一个字符之前停止迭代,而不是迭代到包含长度/2(您需要检查开头和结尾而不重叠,因此无需迭代到结尾或几乎)。
您substringEnd
应该从右侧开始,因此它应该看起来像string.substring(string.length()-i);
。
下面是一个固定的实现:
public static void main(String[] args) {
List<String> listTest = List.of("abXYab", "xx", "xxx", "xxxx", "javaXYZjava", "javajava", "Hello! and Hello!", "x", "", "abcd", "mymmy");
String substringFront, substringEnd, longestMatch;
for (String string : listTest) {
longestMatch = "";
for (int i = 1; i <= string.length() / 2; i++) {
substringFront = string.substring(0, i);
substringEnd = string.substring(string.length() - i);
if (substringEnd.equals(substringFront) && substringEnd.length() > longestMatch.length()) {
longestMatch = substringEnd;
}
}
if (!listTest.equals("")) {
System.out.printf("%s => %s%n", string, longestMatch);
} else {
System.out.printf("%s => null%n", string);
}
}
}
以下是测试上述代码的链接:
https://www.jdoodle.com/iembed/v0/rEO
但是,为了使其更简洁,您可以使用正则表达式,它使用带有贪婪量词的捕获组在字符串的开头进行匹配,并确保在开头捕获的内容也在结尾匹配。
^(.+)(.*)\1$
这是一个测试正则表达式的链接:
https://regex101.com/r/cgowDQ/1
这可以用Java这样写:
public static void main(String[] args) {
List<String> listTest = List.of("abXYab", "xx", "xxx", "xxxx", "javaXYZjava", "javajava", "Hello! and Hello!", "x", "", "abcd", "mymmy");
Pattern pattern = Pattern.compile("^(.+)(.*)\\1$");
Matcher matcher;
for (String s : listTest) {
matcher = pattern.matcher(s);
if (matcher.find()) {
System.out.printf("%s => %s%n", s, matcher.group(1));
} else {
System.out.printf("%s => null%n", s);
}
}
}
您可以在此处测试上述代码:
https://www.jdoodle.com/iembed/v0/rEK
除了@Dan和其他人恰当地指出的技术问题外,我还想强调不必要的复杂性问题,这在许多情况下会导致此类逻辑错误。
考虑到这一点,并考虑到这是一个挑战,我更喜欢一种极简主义的方法,如下面的方法,它不言自明,因此易于理解和调试。
public String sameEnds(String string) {
int middle = string.length() / 2;
for (int i = middle; i >= 0; i--) {
String left = string.substring(0, i);
if (string.endsWith(left)) {
return left;
}
}
return "";
}
给定CodingBat中的任务maxBlock: 给定一个字符串,返回字符串中最大“块”的长度。块是相同的相邻字符的运行。 我的解决方案通过了所有测试,除了一个:
我试图在codingbat上解决这个数组问题,但我有一些问题,我的代码的问题是它没有找到最大的奇数 赋值返回给定数组的一个版本,其中数组中的每个零值都被数组中零值右侧的最大奇数替换。如果零的右边没有奇数,则将零保留为零。 这是我的密码
我是新的编码,并有这个问题的问题,任何帮助都是感激的。 提示:将你的BMI计算四舍五入到小数点后一位。确保返回的消息与显示的完全相同。 我做错了什么!!这就是我得到的错误。 错误:公共字符串BMIResult(双重,双高){
我遇到了一个关于编码蝙蝠的问题,问题是: 给定一个字符串,返回一个由原始字符串的最后2个字符的3个副本组成的新字符串。字符串长度至少为2。我解决了这个问题,解决方案(下图)比我的好,但是,解决方案代码有一个问题,当字符串长度小于2时,假设长度只有1。str索引将是-1。代码还能工作吗?为什么网站说解决方案是正确的?
Codingbat的任务: 给定一个字符串,计算以“y”或“z”结尾的单词数——“heavy”中的“y”和“fez”中的“z”,而不是“yellow”中的“y”(不区分大小写)。如果单词后面没有字母,我们会说y或z位于单词的末尾。(注意:测试字符是否为字母。) 我正在尝试这样解决这个任务: 但并不是所有的测试都通过了。如何修复regex=([..^y^z]\b)”以通过所有测试?
这个问题要求在键盘上键入字符串所需的总时间,用一个手指表示为二维字符矩阵。 输入: 第一行包含n和m作为输入,表示键盘矩阵的维数 接下来的n行包含m个字符,每个字符表示键盘中的字符 下一行将包含字符串S 输出: 说明:手指最初位于键盘的第一个符号,因此按下该键所需的时间为0。之后,新键位于1,1,因此总时间为|1-0||1-0|即2。现在第三个键位于位置1,2,因此移动到该键的总时间为|2-1||