表驱动分为三种,分别是:直接索引、索引表、阶梯索引。一般直接索引使用比较广泛,也容易想到。今天在网上看到了一笔试题,统计一个字符串中第一次出现且频率最高的字符。看到这道题以后,我觉得使用表驱动能很快、很容易地解决问题,下面是我使用表驱动给出的解法。
- public static
char statMostRateChar(String str) {
-
if (str != null && !"".equals(str)) {
-
int charsStat[] = new
int[128];
-
int charsFirstIdx[] =
new int[128];
-
int strLen = str.length();
-
for (int ch =
0; ch < 128;ch++) {
- charsFirstIdx[ch] = strLen;
- }
-
-
for (int idx =
0; idx < strLen; idx++) {
- charsStat[str.charAt(idx)]++;
-
-
if (idx < charsFirstIdx[str.charAt(idx)]) {
- charsFirstIdx[str.charAt(idx)] = idx;
- }
- }
-
int mostRateChar = 0;
-
for (int ch =
1; ch < 128; ch++) {
-
if (charsStat[ch] == 0) {
-
continue;
- }
-
-
if (charsStat[mostRateChar] < charsStat[ch]) {
- mostRateChar = ch;
-
-
} else if (charsStat[mostRateChar] == charsStat[ch]&&
- charsFirstIdx[mostRateChar] > charsFirstIdx[ch]) {
- mostRateChar = ch;
- }
- }
-
return (char) mostRateChar;
-
} else {
-
return '\0';
- }
- }
public static char statMostRateChar(String str) {
if (str != null && !"".equals(str)) {
int charsStat[] = new int[128];
int charsFirstIdx[] = new int[128];
int strLen = str.length();
for (int ch = 0; ch < 128;ch++) {
charsFirstIdx[ch] = strLen;
}
// 統計字符出現的次數
for (int idx = 0; idx < strLen; idx++) {
charsStat[str.charAt(idx)]++;
// 记录字符第一次出现的位置
if (idx < charsFirstIdx[str.charAt(idx)]) {
charsFirstIdx[str.charAt(idx)] = idx;
}
}
int mostRateChar = 0;
for (int ch = 1; ch < 128; ch++) {
if (charsStat[ch] == 0) {
continue;
}
// 找频率出现最高的字符
if (charsStat[mostRateChar] < charsStat[ch]) {
mostRateChar = ch;
// 出现频率一样时,选择出现在前面的数
} else if (charsStat[mostRateChar] == charsStat[ch]&&
charsFirstIdx[mostRateChar] > charsFirstIdx[ch]) {
mostRateChar = ch;
}
}
return (char) mostRateChar;
} else {
return '\0';
}
}
这是我对表驱动的一点认识,我觉得选择表驱动,提高代码的执行效率以及可读性,但同时却牺牲了存储空间。如果在不浪费大量空间的前提下,表驱动的确是一个不错的选择。
相关文章:
-
2021-08-26
-
2021-08-15
-
2021-07-11
-
2021-05-24