牛客网上的题目要求与书上的略有不同,如上。书上说的是char,char是8bit字符类型,共有256个,所以简易hash表长度是256。
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int length = str.length();
int tableSize = 58;
int hashTable[tableSize];
for(int i=0; i<tableSize; i++) {
hashTable[i] = 0;
}
for(int i=0; i<length; i++) {
hashTable[str[i]-'A']++;
}
for(int i=0; i<length; i++) {
if(hashTable[str[i]-'A'] == 1) {
return i;
}
}
return -1;
}
};
这是我借着对一个半月前看过书的一点记忆加上一点小技巧写出的答案。不是很完美,但有如下思考:
1.哈希表用普通数组实现是这道题妙处。题目要求区分大小写,我去网上查了一下ASCII码表,大写字母和小写字母不相邻着,'A'在第65个,‘z‘在第122个,所以hash表长度为122-64 = 58,有一些冗余,但问题不大。 这样就可以用字母与‘A’的差作为索引(从0开始),出现的次数作为键值,构造出一个简单的哈希表。
2.书上要求返回字符,返回字符可以在构建好hash表后直接遍历hash表,找到值为1的元素,求出它代表的数字返回,但是要返回这个字符在原字符串中的下标,就要进行额外的工作。我的思考是再来一个hash表记录对应字符的位置。书上的思路是再次遍历原字符串。