【问题标题】:Maximum Repeating characters and count最大重复字符和计数
【发布时间】:2018-10-23 09:54:29
【问题描述】:

我想获得最大重复字符数及其相关索引。我能够打印给定字符串及其索引中的最大重复字符。但是我无法打印重复字符的总数。下面是我的代码

public class MaxRepeating {

static char charactercountIndex(String str) {
    int len = str.length();
    int count = 0;

    char res = str.charAt(0);
    for (int i = 0; i < len; i++) {
        int cur_count = 0;
        for (int j = i + 1; j < len; j++) {
            if (str.charAt(i) != str.charAt(j))
                break;
            cur_count++;
        }

        if (cur_count > count) {
            count = cur_count;
            res = str.charAt(i);

        }
    }
    return res;

}

public static void main(String args[]) {

    String str = "aaaaaaccde";
    char s1 = charactercountIndex(str);
    str.indexOf(s1);
    System.out.println(str.indexOf(s1));
    System.out.println(charactercountIndex(str));

    }
  }

输出应该 0 是字符 a 的索引 6 是字符串中出现的总时间字符“a”

【问题讨论】:

  • 我怀疑您的索引是否正确。你可以google一下问题。网上有多种解决方案
  • 我得到了正确的索引,但是我不能得到字符的实际计数(在这种情况下是“a”,应该是 6)

标签: java string character


【解决方案1】:

如果您愿意采用稍微不同的方法,则可以使用正则表达式和流来实现这一点,这是一种相当简单的方法。我们可以尝试使用以下正则表达式将输入字符串拆分为类似字母的子字符串组件:

(?<=(.))(?!\\1)

然后,我们可以使用Collections.max 查找集合中最大的字符串,最后使用String#indexOf 查找该子字符串的索引。

String str = "aaaabbddddddddddddddddddddaaccde";
List<String> parts = Arrays.asList(str.split("(?<=(.))(?!\\1)"));
String max = Collections.max(parts, Comparator.comparing(s -> s.length()));
System.out.println("largest substring: " + max);
int index = str.indexOf(max);
System.out.println("index of largest substring: " + index);

largest substring: dddddddddddddddddddd
index of largest substring: 6

【讨论】:

  • 有趣的方法,但对于初学者来说可能“太多”了。
  • @Amessihel 我永远不知道什么是最佳答案。对于有类似问题的职业工程师来说,这个答案可能更符合他们希望看到的内容。对于初学者来说,最好的答案是更正 OP 的代码。
【解决方案2】:

我做过这样的事情:

static Entry<String, Integer> charactercountIndex(String str) {
    HashMap<String, Integer> stringIntegerHashMap = new HashMap<>();
    for (String letter : str.split("")) {
        if (stringIntegerHashMap.containsKey(letter)) {
            stringIntegerHashMap.put(letter, (stringIntegerHashMap.get(letter) + 1));
        } else {
            stringIntegerHashMap.put(letter, 1);
        }
    }

    Entry<String, Integer> maxEntry = null;

    for (Entry<String, Integer> entry : stringIntegerHashMap.entrySet()) {

        if (maxEntry == null
                || entry.getValue().compareTo(maxEntry.getValue()) > 0) {
            maxEntry = entry;
        }
    }

    return maxEntry;
}

public static void main(String args[]) {

    String str = "aaaabbddddddddddddddddddddaaccde";
    Entry<String, Integer> s1 = charactercountIndex(str);
    System.out.println(s1.getKey());
    System.out.println(s1.getValue());
}

如果您有任何问题,请告诉我。

【讨论】:

    【解决方案3】:

    您可以通过本地类实例(其中包含字符及其出现)返回结果。我添加了一个本地类CountResult

    顺便说一句,我修复了你的代码(请参阅// including ... 评论)。

    您可以尝试检查here下方的工作代码。

    public class MaxRepeating {
    
        private static CountResult charactercountIndex(String str) {
            int len = str.length();
            char res = str.charAt(0);
            int count = 0;
            for (int i = 0; i < len; i++) {
                int cur_count = 1; // including the tested char (first occurence)
                for (int j = i + 1; j < len; j++) {
                    if (str.charAt(i) != str.charAt(j))
                        break;
                    cur_count++;
                }
    
                if (cur_count > count) {
                    res = str.charAt(i);
                    count = cur_count;
                }
            }
            return new CountResult(res, count);
    
        }
    
        private static class CountResult {
            private char maxChar;
            private int count;
    
            public CountResult(char maxChar, int count) {
                this.maxChar = maxChar;
                this.count = count;
            }
    
            public String toString() {
                return String.format("<" + maxChar + "," + count + ">");
            }
    
        }
    
        public static void main(String args[]) {
    
            String str = "aaaaaaccde";
            System.out.println(charactercountIndex(str));
    
            }
          }
    

    【讨论】:

    • 感谢您的解决方案,但是我稍作修改以获得索引值。
    【解决方案4】:

    您可以创建自己的类,您将不受方法返回参数数量的限制。

    public class MyCharacter {
        private static int count;
        private static char character;
        private static int indexOf;
    
        public void characterCountIndex(String str) {
            int len = str.length();
            for (int i = 0; i < len; i++) {
                int cur_count = 1;
                for (int j = i + 1; j < len; j++) {
                    if (str.charAt(i) != str.charAt(j))
                        break;
                    cur_count++;
                }
    
                if (cur_count > count) {
                    count = cur_count;
                    character = str.charAt(i);
                    indexOf = str.indexOf(character);
                }
            }
        }
    
        @Override
        public String toString() {
            return String.format("<%d, %d>", indexOf, count);
        }
    
        public static void main(String[] args) {
            String str = "aaaaaaccde";
            MyCharacter myCharacter = new MyCharacter();
            myCharacter.characterCountIndex(str);
            System.out.println(myCharacter);
        }
    }
    

    【讨论】:

    • 为什么不直接编辑您之前的答案?它没有被否决或任何东西:-|
    • 是否还有可能摆脱我的一个答案?
    • 只需从已删除的答案中删除内容并替换为-------等即可。
    • 我对上面的程序有点困惑,为什么 cur_count 变量在第二个 for 循环内每次都增加,并且对于第二个 for 循环内的每个语句,它每次都增加 +1。我不明白它是如何增加的。
    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2016-06-13
    相关资源
    最近更新 更多