表驱动分为三种,分别是:直接索引、索引表、阶梯索引
表驱动分为三种,分别是:直接索引、索引表、阶梯索引。一般直接索引使用比较广泛,也容易想到。今天在网上看到了一笔试题,统计一个字符串中第一次出现且频率最高的字符。看到这道题以后,我觉得使用表驱动能很快、很容易地解决问题,下面是我使用表驱动给出的解法。
这是我对表驱动的一点认识,我觉得选择表驱动,提高代码的执行效率以及可读性,但同时却牺牲了存储空间。如果在不浪费大量空间的前提下,表驱动的确是一个不错的选择。
- 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';
- }
- }
这是我对表驱动的一点认识,我觉得选择表驱动,提高代码的执行效率以及可读性,但同时却牺牲了存储空间。如果在不浪费大量空间的前提下,表驱动的确是一个不错的选择。