
一开始我的想法是利用桶的思想,定义一个26大小的数组,对应字母a到z,然后遍历字符串,让数组对应位置里的值加一,最后统计出每个字母出现的次数,然后遍历arr数组,找到大小为1的,就是仅出现一次的字符。
但是发现程序还是不行。然后发现这时会出现次序问题,题目中要求的是第一次出现仅一次的。那么我们可以再遍历一遍字符串,然后找到数量为1的,自然就是第一次出现并且仅出现一次的字符了。并且题目说了字符串长度小于100000,两次都是单层循环,时间也是没什么问题的。
cpp
#include<iostream>
using namespace std;
#include<string>
int main()
{
string s1;
getline(cin, s1);
int arr[26] = { 0 };
for (int i = 0; i < 26; i++)
{
arr[i] = 0;
}
int num = 0;
for (int i = 0; i < s1.length(); i++)
{
num = s1[i] - 97;
arr[num] += 1;
}
bool flag = 0;
for (int i = 0; i < s1.length(); i++)
{
if (arr[s1[i] - 97] == 1)
{
cout << s1[i];
flag = 1;
break;
}
}
if (!flag) {
cout << "no";
}
}