【问题标题】:How do I count the number of occurrences of a char in a Multiple String?如何计算多个字符串中 char 的出现次数?
【发布时间】:2016-12-08 23:10:58
【问题描述】:

我的问题很特别,

给出这些字符串

          123456  
String1   ABCD
String2    BDD
String3     CDEF

我们可以看到

  • 第 1 列中 A 的个数为 1。
  • 第 2 列中 B 的数量为 2。
  • 第 3 列中 C 的数量为 2。
  • 第 3 列中 D 的数量为 1。
  • 第 4 列中 D 的数量为 3。
  • 第 5 列中 E 的数量为 1。
  • 第 6 列中 F 的数量为 1。

这些计算的目的是获取在每列中出现最多的字符。

我可以用来处理这个问题的最佳 DataStructure 是什么?知道我只在执行时才知道每个字符串的长度。

我已经知道的信息是每个字符串开始的列的 n°。

我的想法和我认为这不是最好的想法是遍历列 n° 并计算每个字符出现了多少,最后找到出现次数最多的字符。

你有更好的解决方案吗?

info: 我的字符串只能包含那些 char[A,B,C,D,E,F] 谢谢。

【问题讨论】:

  • 您可能需要考虑每个字符串长度为一个字符的特殊情况,因此您只需考虑位置 1。给定“A”、“A”、“B”,你如何确定“A”是答案?
  • 所以我创建了一个包含 6 个案例的数组,每个字母的每个案例,0 代表 A,1 代表 B ....,因为我们只有一列,我将测试字符串的每个第一个字符每次我添加 +1 时,我拥有最大 num 的情况是出现次数最多的字符的情况,在你的示例中,我将在 0 的情况下有 2 ,这意味着 char A ,我们将有 1 的情况2.希望你能理解我。
  • 我认为您应该将其写在纸上并跟踪各个步骤,并将值保存在变量中。这将帮助您了解如何向计算机表达这一点。

标签: java string algorithm


【解决方案1】:

通过这个示例代码,您可以将字符串作为列表插入,因此代码中的字符串数量不会受到任何限制,但会给出正确的输出。我在需要的地方添加了内联 cmets。

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class StringOperation {
public static void main(String[] args) {
    List<String> stringList=new ArrayList<String>();
    stringList.add("ABCD");
    stringList.add(" BDD");
    stringList.add("  CDEF");
    stringList.add("ABCD");

    char[][] array=getTwoDimentionArray(stringList);

    for (int i = 0; i < array.length; i++) {
        char[] cs = array[i];
        numberOfCharactorsinString(cs, i);

    }

}

//This method will create two dimension array from String list same time it will convert columns in to rows
public static char[][] getTwoDimentionArray(List<String> list){
    char[][] twoDimenArray=null;
    int maxLength=0;
    for (String strings : list) {
        if(maxLength<strings.length()){
            maxLength=strings.length();
        }               
    }
    twoDimenArray=new char[maxLength][list.size()];
    for (int i = 0; i < list.size(); i++) {
        char[] charArray=list.get(i).toCharArray();
        for (int j = 0; j < charArray.length; j++) {
            twoDimenArray[j][i] = charArray[j];             
        }           
    }

    return twoDimenArray;
}

//This method will return the char occurrences in the given char array
public static void numberOfCharactorsinString(char[] charArray,int count){

    //Here we use set to identify unique chars in the char array
    Set<Character> uniqueSet=new HashSet<Character>();
    int forcount=0;
    for (Character charVar : charArray) {
        int occurent=1;

        //check whether the searching char is not empty and not a space and not in previously counted
        if( charVar!=Character.MIN_VALUE && charVar!=' ' && !uniqueSet.contains(charVar) && forcount<charArray.length){
            uniqueSet.add(charVar);
            for (int x=forcount+1;x<charArray.length;x++ ) {
                if(charArray[x]==charVar){
                    occurent++;
                }
            }
            System.out.println("The number of "+charVar+" in column "+(count+1)+" is "+occurent+".");
        }
        forcount++;
    }
}
}

如果您提供输入(请注意,我已在此处的第 4 行添加了其他输入)

String1   ABCD
String2    BDD
String3     CDEF
String1   ABCD

输出如下

The number of A in column 1 is 2.
The number of B in column 2 is 3.
The number of C in column 3 is 3.
The number of D in column 3 is 1.
The number of D in column 4 is 4.
The number of E in column 5 is 1.
The number of F in column 6 is 1.

【讨论】:

  • 感谢您的帮助,解决方案完美运行我给了您投票。为什么我没有选择您的回复?您使用 2 for 循环来查找出现次数最多的字符,所以它花了 O (n²) ,这不是进行搜索的最佳方式。无论如何,谢谢,您给了我一些见解。
【解决方案2】:
public class Main {
    public static void main(String[] args) {
        String str1 = "ABCD  ";
        String str2 = " BDD  ";
        String str3 = "  CDEF";
        String[] reversed = getReversed(str1, str2, str3);  // reverse rows with columns

        for(int i=0; i< reversed.length; i++){
            String trimedString = reversed[i].trim();  // removes spaces that around the string
            System.out.println(findMaxOccurrenceCharValue(trimedString));  // counts the maximum occurrence char
        }
    }

    private static String[] getReversed(String str1, String str2, String str3){
        char[] s1 = str1.toCharArray();
        char[] s2 = str2.toCharArray();
        char[] s3 = str3.toCharArray();

        String[] newStr = new String[6];
        for(int i =0; i<6; i++){
            newStr[i] = "" + s1[i] + s2[i] + s3[i];
        }
        return newStr;
    }

    private static String findMaxOccurrenceCharValue(String str) {
        char[] array = str.toCharArray();
        int[] count = new int[1000];
        for(char c: array){
            count[c]++;
        }

        // find the max occurrence character and number of occurrence
        String maxCharacter = "";
        int maxValue = -1;
        for(int i=0;i< array.length;i++){
            if(count[array[i]] > maxValue){
                maxValue = count[array[i]];
                maxCharacter = String.valueOf(array[i]);
            }
        }
        return  maxCharacter + "=" + maxValue;
    }
}

输出:

A=1
B=2
C=2
D=3
E=1
F=1

【讨论】:

  • 谢谢,但 C 必须得到 2 而不是 1 的分数,是否有错误,我将审查您的解决方案,因为我正在寻找背后的想法。
  • 好的,谢谢,即使我不同意您代码中的某些内容,例如仅对某些字符使用 1000 大小写是浪费内存。
猜你喜欢
  • 2019-02-26
  • 2011-05-13
  • 2019-06-03
  • 2015-12-07
  • 2012-10-03
  • 2013-02-24
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
相关资源
最近更新 更多