前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >表驱动分为三种,分别是:直接索引、索引表、阶梯索引

表驱动分为三种,分别是:直接索引、索引表、阶梯索引

作者头像
用户4766018
发布2022-08-19 08:19:42
2010
发布2022-08-19 08:19:42
举报
文章被收录于专栏:格物致知

表驱动分为三种,分别是:直接索引、索引表、阶梯索引。一般直接索引使用比较广泛,也容易想到。今天在网上看到了一笔试题,统计一个字符串中第一次出现且频率最高的字符。看到这道题以后,我觉得使用表驱动能很快、很容易地解决问题,下面是我使用表驱动给出的解法。

Java代码

代码语言:javascript
复制
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'; 
} 
} 
代码语言:javascript
复制
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';
    }
}

这是我对表驱动的一点认识,我觉得选择表驱动,提高代码的执行效率以及可读性,但同时却牺牲了存储空间。如果在不浪费大量空间的前提下,表驱动的确是一个不错的选择。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011/07/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档