剑指OFFER题29------按牛客网热度排序
时间:2018.11.26.2018
作者:Waitt
题目
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)
时间限制:1秒 空间限制:32768K 热度指数:198943
解答
解法1
这道题类似于:https://blog.csdn.net/Waitt_/article/details/83387591
参考类似题的解法:
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int co[128]={0};
int n=str.size();
queue<char> s;
for(int i=0;i<n;i++)
{
co[str[i]]++;
if(co[str[i]]==1)
s.push(str[i]);
}
n=s.size();
char a;
while(!s.empty())
{
if(co[s.front()]==1)
{
a=s.front();
break;
}
s.pop();
}
if(s.empty())
return -1;
n=str.size();
int i=0;
for(;i<n;i++)
{
if(str[i]==a)
break;
}
return i;
}
};
解法2
string已有,并不会像上面参考题一样,输入无保存。
可以用两次循环,一个数组。
第一次循环求出每种字符出现的次数,第二次求第一个只出现一次的字符的位置。
class Solution {
public:
int FirstNotRepeatingChar(string str) {
int co[128]={0};
int i=0;
int n=str.size();
//第一次循环求出每种字符出现的次数
for(;i<n;i++)
{
co[str[i]]++;
}
i=0;
//第二次求第一个只出现一次的字符的位置
for(;i<n;i++)
{
if(co[str[i]]==1)
return i;
}
//若循环结束,则说明没有找到只出现一次的字符,返回-1.
return -1;
}
};