版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanani_Jia/article/details/82559332
题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
最开始看到这个题目的时候自己感觉没有思路,就直接跳过了,然后开始看其他的题目,但是在翻看自己博客的时候看到了一个可以解决这个问题的方法。就是哈希,因为学过哈希已经过去一段时间了,所以自己开始并没有想到这个方法。
并且自己的应变能力和思维能力确实比较差,题目稍微有变动就不知道怎么去解决。自己之前写的时候是一个函数,通过传进来的参数是一个字符串来求解,但是这道题目却给了两个函数,让我发懵了很久。
这里的insert函数主要是在组建字符串,这里是一个字符一个字符给你的,你要把他组起来。
class Solution
{
public:
//Insert one char from stringstream
void Insert(char ch)
{
str += ch;
hash[ch ]++;
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce()
{
int i = 0;
for (i = 0; i < str.size(); i++)
{
if (hash[str[i]] == 1)
return str[i];
}
return '#';
}
int hash[256] = { 0 };
string str;
};
这里我们定义一个string类型的变量用来存储字符串,然后再定义一个哈希映射的数组。这里的思想就是我们把每个字符都映射到一个唯一的数组中的位置,数组中初始值都是0代表着这个数组中的字符都出现了0次,然后获取字符,没获取到一个字符,那就把这个数组中字符对应的位置的数字进行++,变成了几那就说明这个字符串出现了几次。
之后要做的就是去遍历我们的数组,这里要注意的是,我们不能说把这个数组开始从0位置开始遍历,遇到第一个是1的就返回这个数,我们要找的是字符串中第一个出现的字符,所以当然要从字符串第一个开始,我们要找到字符串第一个字符对应的数组中的位置,然后看看是不是1不是的话找字符串中第二个字符对应的映射位置是不是1,以此类推,直到找到是1的那个为止。
for (i = 0; i < str.size(); i++)
{
if (hash[str[i]] == 1)
return str[i];
}
所以这里要格外的注意,i的条件是小于字符串的长度,而不是说256,然后每次访问的不是hash[i]而是hash[str[i]]。
https://blog.csdn.net/Hanani_Jia/article/details/80265815 这是我之前写过的字符串中只出现一次的字符。
下边是今天的选择题
NumberList是一个顺序容器,以下代码执行后,NumberList里的元素依次为:
List<int> NumberList = new List<int>(){2,4,1,3,5};
for(int i = 0;i<NumberList.Count;++i)
{
int v = NumberList[i];
if(v%2 = = 0)
{
NumberList.Remove(v);//删除的是元素,而非下标
}
}
A.2,4,1,3,5
B.2,1,3,5
C.4,1,3,5
D.1,3,5