【问题标题】:Find the word with the greatest numbers of repeated letters找到重复字母最多的单词
【发布时间】:2015-05-15 04:56:46
【问题描述】:

对于这个挑战,我需要找到重复字母数量最多的单词。例如,如果我输入Hello world!,则输出应该是Hello,因为它包含l2 字符,或者No words,它应该是-1。 我将问题分解为:

1) 将一句话破入words的数组中

2) 循环遍历每个word

3) 循环遍历每个charcater

如果一个单词包含的字母比其他单词多,我应该如何返回。

public static void main(String[] args) {
    Scanner kbd = new Scanner(System.in);
    System.out.println("Enter any sentence or word combination: ");
    String myString = kbd.nextLine();
    String result = "";
    int count = 0;

    String[] words = myString.split("\\s+");
    for(int i = 0; i < words.length; i++) {
        for(int j = 0; j < words[i].length(); j++) {
            for(int k = 1; k < words[i].length(); k++) {
                char temp = words[i].charAt(k);
                if(temp == words[i].charAt(k-1)) {
                    count++;
                }

            }

        }
    }
}

【问题讨论】:

  • 你能定义重复的字母吗? “hello”、“heelloo”的重复次数是多少?
  • 或者banana?这个值是 3 吗?
  • 我不明白你的k循环在做什么,你不应该从k=j+1开始比较.charAt(j) to .charAt(k)吗?您还需要将每个单词的计数变量归零,可能是每个字母(取决于您如何定义计数)。
  • @BenjyKessler,它应该返回具有相同第一个重复字母的单词。在"heelloo" 中,它应该是e,因为它首先出现。
  • @Tony,是的,正确的。

标签: java


【解决方案1】:

你几乎做到了,我想你正在研究这样的事情:

static int mostFreqCharCount(final String word) {
    final int chars[] = new int[256];

    int max = 0;
    for (final char c : word.toCharArray()) {
        chars[c]++;
        if (chars[c] > chars[max]) // find most repetitive symbol in word
            max = c;
    }
    return chars[max];
}

public static void main(final String[] args) {
    System.out.println("Enter any sentence or word combination: ");

    final Scanner kbd = new Scanner(System.in);
    final String myString = kbd.nextLine();
    kbd.close();

    int maxC = 0;
    String result = "";

    final String[] words = myString.split("\\s+");
    for (final String word : words) {
        final int c = mostFreqCharCount(word);
        if (c > maxC) {
            maxC = c;
            result = word;
        }
    }

    if (maxC > 1) // any word has at least 1 symbol, so we should return only 2+
        System.out.println(result);
}

主要思想 - 计算每个单词的最频繁符号的数量,并将最大的一个存储在变量 maxCresult

【讨论】:

  • 不错!使用 256 数组而不是 HashMap,更干净
  • @SashaSalauyou 是的,对于全套 Java 符号,您需要使用 65536 长度的数组
【解决方案2】:

您需要创建一个长度 = words.length 的数组,并将每个单词的最大值存储在其相对索引中:

int counts[] = new int[words.length];
for(int i = 0; i < words.length; i++) {
    for(int j = 0; j < words[i].length(); j++){
            count = 0
            for(int k = k+1; k < words[i].length(); k++){
                if(words[i].charAt(j) == words[i].charAt(k)){
                    count++;
                }
            if(counts[i] < count)
                  counts[i] = count;
      }

}

然后只需扫描数组中的最大值 n,然后返回 words[n]

【讨论】:

    【解决方案3】:

    如果你只需要一个字数最多的单词,你只需要三个变量,一个用于currentBestWord,一个用于currentLargestCount,一个用于保持一个单词的字符数。

    int currentLargestCount=0;
    String currentBestWord="";
    HashMap<String,Integer> characterCount=new HashMap<String,Integer>();
    String[] words=myString.split("\\s+");
    for(int i=0;i<words.length;i++){
        String w=words[i];
        characterCount=new HashMap<String,Integer>();
        for(int j=0;j<w.length();j++){
            String character=w.charAt(j).toString();
            if(characterCount.containsKey(character)){
                characterCount.put(character,characterCount.get(character)+1);
            }else{
                 characterCount.put(character,1);
            }
        }
        // Now get the largest count of this word
        Iterator ir=characterCount.ValueSet().iterator();
        int thiscount=0;
        while(ir.hasNext()){
             int thischaractercount=ir.next();
             if(thiscount<thischaractercount) thiscount=thischaractercount;
        }
        if(thiscount>currentLargestCount){
            currentLargestCount=thiscount;
            currentBestWord=w;
        }
    }
    

    【讨论】:

    • 最好改成Map&lt;Character, Integer&gt;
    猜你喜欢
    • 2021-07-01
    • 2015-06-13
    • 2015-10-09
    • 1970-01-01
    • 2011-10-02
    • 2017-05-31
    • 2015-02-15
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多