第一个只出现一次的字符/unordered_map的新理解/stringr.find的学习
题目
力扣的题:
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。
s 只包含小写字母。
示例 1:
输入:s = "abaccdeff"
输出:'b'
示例 2:
输入:s = ""
输出:' '
我的代码
class Solution {
public:
char firstUniqChar(string s) {
int count = s.size();
for (int i = 0; i < count; ++i) {
if (s.find(s[i])==s.rfind(s[i])) {
return s[i];
}
}
return ' ';
}
};
从前找这个字符第一次出现的位置,
从后找这个字符最后一次出现的位置,
如果是同一个位置,证明它只出现了一次。
示例代码
class Solution {
public:
char firstUniqChar(string s) {
int ord[26] = {0};
for(char c: s) {
ord[c - 'a'] ++; // 数字是减0字符,字母是减a字符。。。。。都减的是开头的东西
}
for(char c: s) {
if(ord[c - 'a'] == 1) return c;
}
return ' ';
}
};
示例代码运用了题目条件,即只有小写字母。但是这方法其实很局限,而且还不怎么高效。
unordered_map的新理解
我本来想用unordered_map来存储每个字符出现的次数,然后把第一个只出现一次的字符返回即可。但是发现unordered_map是真的无序,它不是按我给它insert的顺序存储的。
unordered_map<char, int> mymap;
mymap['l']=1;
mymap['e']=1;
mymap['t']=1;
for (auto iter = mymap.begin(); iter != mymap.end(); ++iter) {
cout << iter->first;
}
我试过用insert来存储,效果也是一样。
string.rfind的学习
与string.rfind很相似,但它是从后面向前查找的,可以看这个链接。