首页 > 解决方案 > 运行长度编码,如何删除仅出现一次的字符之前的“1”?

问题描述

我有一个涉及使用运行长度编码的作业问题。问题是,我们不允许在任何只出现一次的字符前加上“1”。例如,如果你输入 AAABBC,我会得到 3A2B1A,但我需要得到 3A2BA。我缺少一个简单的解决方法吗?

这是我当前的代码:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        String string = "";
        Scanner scanner = new Scanner(System.in);
        System.out.println("Input:");
        String s = scanner.nextLine();

        for(int i = 0, count = 1; i < s.length(); i++) {
            if (i + 1 < s.length() && s.charAt(i) == s.charAt(i +1))
                count++;
            else {
                string = string.concat(Integer.toString(count))
                        .concat(Character.toString(s.charAt(i)));
                count = 1;
            }
        }
        System.out.println(string);
    }
}

标签: java

解决方案


如果计数为 1,只需添加一些额外的逻辑以不打印计数:

for (int i=0, count=1; i < s.length(); i++) {
    if (i + 1 < s.length() && s.charAt(i) == s.charAt(i+1)) {
        count++;
    }
    else {
        String prefix = count > 1 ? Integer.toString(count) : "";
        string = string.concat(prefix)
            .concat(Character.toString(s.charAt(i)));
        count = 1;
    }
}

作为旁注,您应该使用 aStringBuilder而不是原始字符串连接(尽管 Java 可能会自动选择在后台为您执行此操作)。

如果你想坚持你当前的实现,那么这里有一个单行正则表达式清理,你可以尝试:

string = string.replaceAll("(?<=(?:\\D|^))1(?=\\D)", "");

推荐阅读