本文主要是介绍表驱动分为三种,分别是:直接索引、索引表、阶梯索引,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
表驱动分为三种,分别是:直接索引、索引表、阶梯索引。一般直接索引使用比较广泛,也容易想到。今天在网上看到了一笔试题,统计一个字符串中第一次出现且频率最高的字符。看到这道题以后,我觉得使用表驱动能很快、很容易地解决问题,下面是我使用表驱动给出的解法。- 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';
}
}
这是我对表驱动的一点认识,我觉得选择表驱动,提高代码的执行效率以及可读性,但同时却牺牲了存储空间。如果在不浪费大量空间的前提下,表驱动的确是一个不错的选择。
这篇关于表驱动分为三种,分别是:直接索引、索引表、阶梯索引的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!