最多需要返回三个连续的重复字符

时间:2018-10-16 23:41:25

标签: java

我有一个重复的字符串,或者可能是不重复的字符。现在,我必须编写一个以这样的方式返回字符串的程序:如果同一字符连续重复超过3次,则仅应返回3个连续字符。如果连续字符少于3个,则应全部返回。例如。

输入:“ aaaaaabbcccdeeeeeeeeeeeeffff” 预期输出:aaabbcccdeeefff

这里是我做的:

WHERE

输出是原始字符串。弄错了我哪里错了。

3 个答案:

答案 0 :(得分:0)

break循环播放,并在点击counting时停止3。您需要确保“消耗”所有剩余的连续字母。我会打破逻辑。首先是一种计算连续出现次数的方法。喜欢,

private static int countConsecutive(char[] arr, int i) {
    int count = 0;
    for (int j = i; j < arr.length; j++) {
        if (arr[j] == arr[i]) {
            count++;
        } else {
            break;
        }
    }
    return count;
}

然后,我们可以调用它来确定正确的count(以及最少的三个和该数量来确定输出)。而且,相对于StringBuilder,我更喜欢StringBuffer。喜欢,

public static String stringCount(String str) {
    char[] arr = str.toCharArray();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < arr.length; i++) {
        int c = countConsecutive(arr, i);
        int v = Math.min(3, c);
        for (int j = 0; j < v; j++) {
            sb.append(arr[i]);
        }
        i += (c - 1); // <-- not v, but the actual count!
    }
    return sb.toString();
}

答案 1 :(得分:0)

我鼓励您使用调试器并弄清楚代码出了什么问题。这是我想到的一个非常简单的解决方案。

public class StringCountUptoThree  {
    public static void main(String[] args) {
        System.out.println(stringCount("aaaaaabbcccdeeeeeeeeeeffff", 3));
    }

    private static String stringCount(String str, int k) {
        if(str.length() <= k) return str;
        int start = 0, end = 1;
        StringBuilder sb = new StringBuilder();
        sb.append(str.charAt(start));

        while(end < str.length()) {
            char chStart = str.charAt(start);
            char chEnd = str.charAt(end);
            if(chStart != chEnd){
                sb.append(chEnd);
                start = end;
            } else {
                if(end - start < k)
                    sb.append(chEnd);
            }

            end++;
        }

        return sb.toString();
    }
}

答案 2 :(得分:0)

一种聪明的方法是简单地使用regex

  • 匹配并捕获重复超过3个字母的组(匹配字母,然后匹配大于2个字母的组)
  • 将您匹配的字母替换三倍

    "aaaaaabbcccdeeeeeeeeffff".replaceAll("([a-z])\\1{2,}", "$1$1$1");
    

使用.代替[a-z]处理任何类型的字符


演示