Java “理解”;查找最大占用字符“;在字符串算法中
我正在学习数据结构和算法,我有一个小问题,就是理解查找字符串中哪个字符最多的过程 我了解总体目标-拥有一个表示特定字符计数的数组,我显然了解如何在数组中查找max,但我对这段代码(代码来自: 所以它基本上告诉我“给我索引“t”的值”?我怎么能用字符搜索我应该用索引搜索的地方 同样在kotlin中,我得到的期望值(Java “理解”;查找最大占用字符“;在字符串算法中,java,arrays,algorithm,kotlin,ascii,Java,Arrays,Algorithm,Kotlin,Ascii,我正在学习数据结构和算法,我有一个小问题,就是理解查找字符串中哪个字符最多的过程 我了解总体目标-拥有一个表示特定字符计数的数组,我显然了解如何在数组中查找max,但我对这段代码(代码来自: 所以它基本上告诉我“给我索引“t”的值”?我怎么能用字符搜索我应该用索引搜索的地方 同样在kotlin中,我得到的期望值(count[str.get(I)])是int,而不是char 我可能错过了阻止我理解这一点的基本概念,但在短时间的谷歌搜索后,我没有找到多少。Java将把char转换成int,例如,根据
count[str.get(I)]
)是int,而不是char
我可能错过了阻止我理解这一点的基本概念,但在短时间的谷歌搜索后,我没有找到多少。Java将把
char
转换成int
,例如,根据ASCII
表,将'A'转换为65
只要字符串
不包含返回值大于255的字符(例如,“€”
),一个256
位置的数组就足以将可能的char
映射到数组位置。例如,对于英语字母表来说,这就足够了。然而,由于Java中的char是2字节(16位),因此大小为65536
(2^16)的数组就足够安全了。
您还可以从该字符串上存在的所有字符(假设为非null或空字符串)计算max
int
值,并相应地分配数组:
int count[] = new int[str.chars().max().orElse(0)+1];
回到你的问题:
count[some_char]++
将some_char
转换为int
,并在相应的数组count
位置上增加一个值
您可以将此过程视为一个简单的散列函数,将“char”映射到“int”,尽管它很简单,但它非常适合当前的问题,因为它唯一地将给定的char映射到该数组上的某个位置
我正在初始化计数数组以保存整数,但在for循环中我
搜索字符串中的特定字符,例如:
count["t"]++
计数[“t”]++
所以它基本上告诉我“给我指数的值
“t”?我怎么能用chararter搜索我应该搜索的地方呢
索引
请注意,count[“t”]+
会给您一个编译错误,函数str.charAt(i)
返回一个char
,而不是字符串,因此是“t”而不是“t”
一个运行示例:
import java.util.Arrays;
import java.util.stream.Collectors;
public class FindMaximumOccurringChar {
private static int[] countChar(String str) {
int[] count = new int[str.chars().max().orElse(0) + 1];
for (int i = 0; i< str.length(); i++)
count[str.charAt(i)]++;
return count;
}
public static void main(String[] args) {
String str = "miaumiauuuuu";
int[] count = countChar(str);
String str_without_duplicated_char = Arrays.stream(str.split(""))
.distinct()
.collect(Collectors.joining());
for (int i=0; i<str_without_duplicated_char.length(); i++){
System.out.println("The char '"+str_without_duplicated_char.charAt(i)+"' shows up "
+ count[str_without_duplicated_char.charAt(i)] +" times");
}
}
}
基本上,count[str.charAt(i)]++
,存储输入字符串中每个字符的计数。Java将每个字符索引转换为ASCII值
let say str = "abca";
For each iteration :
count['a'] = 1; or count[97] = 1; a has ascii value 97
count['b'] = 1; or count[98] = 1; b has ascii value 98
count['c'] = 1; or count[99] = 1; c has ascii value 99
count['a'] = 2; or count[97] = 2;
The char 'm' shows up 2 times
The char 'i' shows up 2 times
The char 'a' shows up 2 times
The char 'u' shows up 6 times
let say str = "abca";
For each iteration :
count['a'] = 1; or count[97] = 1; a has ascii value 97
count['b'] = 1; or count[98] = 1; b has ascii value 98
count['c'] = 1; or count[99] = 1; c has ascii value 99
count['a'] = 2; or count[97] = 2;