当前位置: 首页 > 知识库问答 >
问题:

编码蝙蝠挑战:maxBlock

暴英达
2023-03-14

给定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;
}

共有3个答案

孟建木
2023-03-14

此代码由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 到生成的代码。

梁丘赞
2023-03-14

虽然我认为@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
缑桐
2023-03-14

您没有正确重置电流块计数。如果以下字符与当前字符不同,您需要将电流块重置为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||