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

来自CodingBat的maxBlock替代解决方案

徐欣德
2023-03-14

从codingBat解决这个问题

给定一个字符串,返回字符串中最大“块”的长度。块是相同的相邻字符的运行。

maxBlock(“hoopla”)→ 2
maxBlock(“abbccddbbbxx”)→ 3
maxBlock(“”)→ 0

我试图解决它使用一个为循环如下:

public int maxBlock(String str) {
  int maxCounter=1;
  int counter=1;
  if(str.length()==0)
  {
    return 0;
  }  
  for(int i=0;i<str.length()-1;i++)
  {
    if(str.substring(i,i+1).equals(str.substring(i+1,i+2)))
    {
      counter++;

    }   
    if(counter>maxCounter)
    {
      maxCounter=counter;
      counter=0;
    }            
  }  


  return maxCounter;          
}

它胜过了所有的案子,除了一个。有人能用一个for循环显示解决方案吗?

很抱歉这么晚才提到,但您不能使用正则表达式或集合框架中的任何东西。

共有3个答案

陆子默
2023-03-14

我来晚了一点,但我的解决方案是:

public int maxBlock(String str) {
    int max = 0;
    int count = 1;
    char o = ' ';

    for (int i = 0; i < str.length(); i++) {
        char c = str.charAt(i);
        if (c == o) {
            count++;
            if (count > max) { max = count; }
        } else {
            count = 1;
            if (count > max) { max = count; }
        }
        o = c;     
    }

    return max;
}
冀越
2023-03-14

您可以使用模式匹配器"(.)(\\1)*"在String中查找重复的char,代码如下:

public int maxBlock(String str) {
        Pattern pattern = Pattern.compile("(.)(\\1)*");
        Matcher matcher = pattern.matcher(str);
        int max = 0;
        while (matcher.find()) {
            max = Math.max(max, matcher.group().length());
        }
        return max;
    }
哈宪
2023-03-14

我认为在某些边缘情况下,您可能会弄错:

public int yourMaxBlock(String str) {
    int maxCounter = 1;
    int counter = 1;
    if (str.length() == 0) {
        return 0;
    }
    for (int i = 0; i < str.length() - 1; i++) {
        if (str.substring(i, i + 1).equals(str.substring(i + 1, i + 2))) {
            counter++;

        }
        if (counter > maxCounter) {
            maxCounter = counter;
            counter = 0;
        }
    }

    return maxCounter;
}

public int myMaxBlock(String str) {
    int maxCounter = 1;
    int counter = 1;
    if (str.isEmpty()) {
        return 0;
    }
    for (int i = 1; i < str.length(); i++) {
        if (str.charAt(i - 1) == str.charAt(i)) {
            if (++counter > maxCounter) {
                maxCounter = counter;
            }
        } else {
            counter = 1;
        }
    }

    return maxCounter;
}

public void test() {
    String[] tests = new String[]{
        "", "+", "++", "+++,++,++,+", "+,++,+++,++,", "+,++,+++,++++", "+++++,++,+++,++++"
    };
    for (String s : tests) {
        int myMax = myMaxBlock(s);
        int yourMax = yourMaxBlock(s);
        System.out.println("myMaxBlock(" + s + ") = " + myMax + (myMax != yourMax ? " WRONG! you have " + yourMax : ""));
    }
}

印刷品

myMaxBlock() = 0
myMaxBlock(+) = 1
myMaxBlock(++) = 2
myMaxBlock(+++,++,++,+) = 3
myMaxBlock(+,++,+++,++,) = 3
myMaxBlock(+,++,+++,++++) = 4 WRONG! you have 3
myMaxBlock(+++++,++,+++,++++) = 5 WRONG! you have 4
 类似资料:
  • 我一直在经历一些编码蝙蝠练习,我遇到了这个问题。"给定一个字符串,返回字符串中最大"块"的长度。块是相同的相邻字符的运行。"所需输出: 除了最后一个“其他测试”,我的代码似乎通过了所有测试。请有人检查一下我的代码,告诉我哪里出了问题。 提交的代码:

  • 我在一本书中发现了一个“用餐哲学家问题”的替代解决方案,用Java编写: 解决方案的文本是: 或者,我们可以给筷子贴上从e到N-1的标签。每个哲学家都试图先拿起编号较低的筷子。这基本上意味着每个哲学家都会先选择左边的筷子,再选择右边的筷子(假设你是这样给它贴标签的),除了最后一位哲学家会选择相反的方式。有了这个解决方案,哲学家不可能拿着大筷子而不拿着小筷子。这就阻止了循环的能力,因为循环意味着较高

  • 我目前正在做codingbat问题的乐趣,我刚刚做了这个问题。 “给定一个字符串,考虑由字符串的前N个字符组成的前缀字符串。该前缀字符串是否出现在字符串的其他地方?假设字符串不是空的,并且N在1..str.length()的范围内。前缀再次(”abxyabc“,1)→真前缀再次(”abxyabc“,2)→真前缀再次(”abxyabc“,3)→假”http://codingbat.com/prob/

  • 给定CodingBat中的任务sameEnds: 如果数组开头和结尾的数字组相同,则返回true。例如,对于,n=0和n=2的endpoint相同,n=1和n=3的endpoint相同。您可以假设n在0范围内。。nums。长度(含)。 我对这个问题的解决方案通过了绝大多数测试,但不是所有测试: 我的问题如下: 如何修复我的解决方案 是否可以使用流API解决此任务

  • 给定来自CodingBat的zeroFront notAlone任务: 返回一个数组,该数组包含与给定数组完全相同的数字,但重新排列以使所有零都在数组的开头分组。非零数字的顺序并不重要。因此变为。您可以修改并返回给定数组或制作一个新数组。 我对这个问题的解决方案在某些情况下会抛出ArrayIndexOutOfBoundsException: 我的问题如下: 如何解决我的问题? 如何使用Stream

  • 给定来自CodingBat的任务sumNumbers sumNumbers: 给定一个字符串,返回字符串中出现的数字之和,忽略所有其他字符。数字是一行中一个或多个数字字符的序列。(注意:Character.isDigit(char)测试字符是否为字符“0”、“1”、…、'9'. 整数parseInt(string)将字符串转换为int.) 我对这个问题的解决方案如下: 是否可以使用流API解决此问