我正在尝试构建一个函数,它获取一串字母,并打印字符串中每个字母的数量。 例如: input:String =" aaabbaccxyxyx" 输出:4a2b2c3x2y
这就是我提出的:
fun quicksort [] = []
| quicksort (x::xs) =
let
val (left, right) = List.partition (fn y => y<x) xs
in
quicksort left @ [x] @ quicksort right
end
但是,这是输出:4a4a4a2b2b4a2c2c3x2y3x2y3x 很多重复..
任何帮助如何使它正确? 请记住,该函数需要返回字符串,而不仅仅是将其打印出来。 谢谢! =)
答案 0 :(得分:1)
我会创建一个int
数组来保持字符串中每个字母的数量。因为有26个字母,所以数组的length
应为26
:
public static String numLetters(String s) {
int[] count = new int[26];
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
count[(int)(c - 'a')]++;
}
String ans = "";
for (int i = 0; i < 26; i++) {
if (count[i] != 0) {
ans += String.valueOf(count[i]) + (char)(i + 'a');
}
}
return ans;
}
答案 1 :(得分:1)
一个简单的变体可能如下所示:
public static String countChars(String arg) {
String res = "";
boolean[] counted = new boolean[arg.length()];
for (int i = 0; i < counted.length; i++) {
if (!counted[i]) {
char c = arg.charAt(i);
int counter = 1;
for (int j = i + 1; j < counted.length; j++) {
if (arg.charAt(j) == c) {
counter++;
counted[j] = true;
}
}
res += counter + "" + c;
}
}
return res;
}
答案 2 :(得分:1)
如果您想保留原始结构,建议您使用StringBuilder
,以便删除已经看过的字符。如果您删除了某个字符,则必须调整索引i
和j
。
public static String numLetters(String str){
StringBuilder s = new StringBuilder(s);
String end = new String();
int counter = 0;
char c,d;
for(int i=0; i<s.length();i++){
c = s.charAt(i);
for(int j=0; j<s.length();j++){
d = s.charAt(j);
if(c == d){
s.deleteCharAt(j);
if (i >= j) i--;
j--;
counter++;
}
}
end = end + counter+c;
counter = 0;
}
return end;
}
答案 3 :(得分:0)
试试这个:
int count = StringUtils.countMatches("a.b.c.d", ".");