题目一:
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
解题思路:这里应该是考察set,map,unordered_set,unordered_map,multiset,multimap等容器的用法。
set和multiset会根据特定的排序准则,自动将元素进行排序。不同的是后者允许元素重复而前者不允许。
也可以采用构建哈希表的方法来实现
解题代码:
1.使用map实现(map底层基于红黑树实现)
PS:map与unordered_map相比:
map底层实现为红黑数,undered_map底层实现为哈希表,两者均不能有重复的建,均支持[ ]运算符
map与multimap相比: 两者底层实现均为红黑树,但是multimap支持重复的键,不支持[ ]运算符
set容器类似,set容器里面:key(关键字)就是value(值)。而map容器是key-value(键-值对)。
class Solution {
public:
int FirstNotRepeatingChar(string str) {
if(str.size()<=0)
return -1;
map<char,int> mp;
for(int i=0; i<str.size(); i++)
mp[str[i]]++;
for(int i=0; i<str.size(); i++)
if(mp[str[i]]==1)
return i;
return -1;
}
};
题目二:
题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
解题思路:使用哈希表,或者特定的容器
解题代码:
1.采用自建哈希表的方法
class Solution
{
public:
string s;
char hash[256]={0}; //自建哈希表,字符char型占1个字节,可以存1字节范围内的整型
//Insert one char from stringstream
void Insert(char ch)
{
s+=ch;
hash[ch]++; //利用字符的ASCII码作为位置索引
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce()
{
int size=s.size();
for(int i=0; i<size; i++)
if(hash[s[i]]==1)
return s[i];
return '#';
}
};
2.使用标准库STL容器来实现 (map,unordered_map底层是用哈希表实现的)
class Solution
{
public:
map<char,int> a;
vector<char> b;
//Insert one char from stringstream
void Insert(char ch)
{
b.push_back(ch);
a[ch]++;
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce()
{
int i;
for(i=0;i<b.size();i++)
if(a[b[i]]==1)
return b[i];
return '#';
}
};