原题网址:https://www.lintcode.com/problem/first-unique-character-in-a-string/description
描述
给出一个字符串,找出第一个只出现一次的字符。
您在真实的面试中是否遇到过这个题? 是
样例
对于 "abaccdeff"
, ‘b‘
为第一个只出现一次的字符.
标签
字符串处理
思路:用两个哈希表,一个统计每个字符出现次数,另一个统计字符的下标。遍历第一个哈希表,找到字符出现次数为1并且下标最小的return出去。
AC代码:
class Solution { public: /** * @param str: str: the given string * @return: char: the first unique character in a given string */ char firstUniqChar(string &str) { // Write your code here char result; int index=-1; int n=str.size(); map<char,int> chCount; map<char,int> chIndex; for (int i=0;i<n;i++) { if (chCount.find(str[i])!=chCount.end())//统计字符数量; { chCount[str[i]]++; } else { chCount[str[i]]=1; } if (chIndex.find(str[i])==chIndex.end())//找到字符的第一个索引; { chIndex[str[i]]=i; } } map<char,int>::iterator it; for (it=chCount.begin();it!=chCount.end();it++) { if (it->second==1&&index==-1) { result=it->first; index=chIndex[it->first]; } else if (it->second==1&&chIndex[it->first]<index) { result=it->first; index=chIndex[it->first]; } } return result; } };
总觉得这样有点麻烦,想了想把第二个哈希表去掉,统计字符次数时如果字符存在于哈希表中,数量- -,否则数量为1。最后返回哈希表第一个元素的first。想法很美好,然而思路有问题。代码提交后只通过部分数据,原因是这样只能消除数量为偶数个的字符,若字符数量为奇数且不为1,结果错误。
在网上搜了搜果然看到了更简洁的代码,真想拍自己一脑门…… 参考:https://www.cnblogs.com/grandyang/p/5802109.html
只用一个哈希表统计字符数量,然后遍历字符串,若当前字符数量为1则返回该字符。
AC代码:
class Solution { public: /** * @param str: str: the given string * @return: char: the first unique character in a given string */ char firstUniqChar(string &str) { // Write your code here int n=str.size(); map<char,int> chCount; for (int i=0;i<n;i++) { if (chCount.find(str[i])!=chCount.end())//统计字符数量; { chCount[str[i]]++; } else { chCount[str[i]]=1; } } for (int i=0;i<n;i++) { if (chCount[str[i]]==1) { return str[i]; } } } };
题目并不难,只是脑子经常驴了……
原文地址:https://www.cnblogs.com/Tang-tangt/p/9189183.html
时间: 2024-11-03 22:31:53