题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
这题比较简单,两个循环搞定,时间复杂度是O(n),但要开一个数组来存每个字符出现的次数,因为是固定的256大小,所以空间复杂度是O(1)。典型的空间换时间。
第一个循环计算每个字符出现次数,第二个循环寻找第一个只出现一次的字符。
【考点】 哈希表
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int hashTable[256];
for(int i = 0; i < 256; i++)
hashTable[i] = 0;
for(int i = 0; i < str.length(); i++)
{
hashTable[str[i]-'\0']++;
}
for(int i = 0; i < str.length(); i++)
{
if(hashTable[str[i]-'\0'] == 1)
return i;
}
return -1;
}
};
查缺补漏:
1.字符char是8bit类型,一个字节,总共256个字符,理论上是占256个字节。书上说占1KB,说明一个字符占了4字节。当然,程序里用int数组,肯定是占了4字节,所以理论上不需要1KB吧。
2.自定义数组当哈希表真他妈方便。c++标准库里有map和unorder_map也可以实现映射,但它们的底层实现不同,这个在面试题里问过无数遍了。map有序因为底层是红黑树,unorder_map无序因为底层是哈希表。
3.ASCII码是从’\0’开始的,大写字母在小写字母前面,数字在大写字母前面。其他应该不用记。