给定CodingBat中的任务maxBlock:
给定一个字符串,返回字符串中最大“块”的长度。块是相同的相邻字符的运行。
maxBlock("hoopla") → 2
maxBlock("abbCCCddBBBxx") → 3
maxBlock("") → 0
我的解决方案通过了所有测试,除了一个:
public int maxBlock(String str) {
int maxBlock = 0;
int currentBlock = 1;
if (str.length() < 1) {
return maxBlock;
} else {
maxBlock = 1;
}
for (int i = 0; i < str.length() - 1; i++) {
if (str.charAt(i) == str.charAt(i+1)) {
currentBlock++;
if (currentBlock > maxBlock) {
maxBlock = currentBlock;
currentBlock = 0;
}
}
}
return maxBlock;
}
此代码由IntelliJ的GitHub Copilot插件生成,您只需输入int maxBlock
,然后GitHub Copilot生成其余代码:
private int maxBlock(String s) {
if (s == null || s.length() == 0) return 0;
int maxBlocks = 0;
int currentBlocks = 0;
char currentChar = s.charAt(0);
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == currentChar) {
currentBlocks++;
} else {
currentBlocks = 1;
currentChar = s.charAt(i);
}
maxBlocks = Math.max(maxBlocks, currentBlocks);
}
return maxBlocks;
}
我只添加了<代码>如果(s==null | | s.length()=0)返回0 到生成的代码。
虽然我认为@Robby Cornelissen和@Eskandar Abedini的解决方案肯定比我的更可行,更接近原始代码,但我想通过使用正则表达式和一些编码逻辑来提供一种不同的方法。
下面的正则表达式查找字符重新出现0次或更多次的匹配项。这可以与Matcher类的results()
方法一起使用,以提取找到的最长匹配。
下面是测试regex的链接
https://regex101.com/r/OcMoQ9/1
List<String> testCase = List.of("hoopla", "abbCCCddBBBxx", "", "xyz", "xxyz", "xyzz", "abbbcbbbxbbbx", "XXBBBbbxx", "XXBBBbbxxXXXX", "XX2222BBBbbXX2222");
Pattern pattern = Pattern.compile("(.)(\\1*)");
Matcher matcher;
for (String s : testCase) {
matcher = pattern.matcher(s);
System.out.printf("%s => %d%n", s, matcher
.results()
.map(match -> match.group().length())
.max(Comparator.comparing(Integer::intValue))
.orElse(0));
}
//Or even simpliefied like so as @Holger has pointed out in the comments
for (String s : testCase) {
matcher = pattern.matcher(s);
System.out.printf("%s => %d%n", s, matcher
.results()
.mapToInt(match -> match.group().length())
.max()
.orElse(0));
}
https://www.jdoodle.com/iembed/v0/rH7
hoopla => 2
abbCCCddBBBxx => 3
=> 0
xyz => 1
xxyz => 2
xyzz => 2
abbbcbbbxbbbx => 3
XXBBBbbxx => 3
XXBBBbbxxXXXX => 4
XX2222BBBbbXX2222 => 4
您没有正确重置电流块
计数。如果以下字符与当前字符不同,您需要将电流块
重置为1
。如果不是,您需要继续增加电流块
:
public int maxBlock(String str) {
int maxBlock = 0;
int currentBlock = 1;
if (str.length() < 1) {
return maxBlock;
} else {
maxBlock = 1;
}
for (int i = 0; i < str.length() - 1; i++) {
if (str.charAt(i) == str.charAt(i+1)) {
currentBlock++;
if (currentBlock > maxBlock) {
maxBlock = currentBlock;
}
} else {
currentBlock = 1;
}
}
return maxBlock;
}
CodingBat中的给定任务sameEnds: 给定一个字符串,返回出现在字符串开头和结尾且不重叠的最长子字符串。例如,sameEnds(“abXab”)是“ab”。 我的解决方案通过了所有测试,除了一个^: 这里有什么问题?我怎样才能修复它?
我试图在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||