目录

解法一.hashmap

1.map的定义及插入,>

2.map的value获取及遍历

3.查找find(key)

4.计数count(key)

解法二.队列

1.队列

2.char以及opencv的waitKey()

3.C++中char和string

(1)char[]和char*区别:

(2)sizeof()、strlen()、length()、size()

(3)char*、char[ ]、string转换


题:实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。如果当前字符流没有存在出现一次的字符,返回#字符。(c++)

解法一.hashmap

#include<iostream>
using namespace std;
#include<map>class Solution
{
public://Insert one char from stringstreamvoid Insert(char ch){str += ch;//将字符流保存在string中charMap[ch]++;//统计字符流中每个字符出现的次数cout<<"str:"<<str<<" key:"<<ch<<" value:"<<charMap[ch]<<" map:"<<endl;map<char,int>::iterator iter;for(iter = charMap.begin(); iter != charMap.end(); iter++)cout<<iter->first<<' '<<iter->second<<endl;}//return the first appearence-once-char in current stringstreamchar FirstAppearingOnce(){   //遍历str,从哈希表中找到第一个出现一次的字符for(int i = 0; i< str.size(); i++){if(charMap[str[i]] == 1){return str[i];}}return '#';}
private:string str = "";map<char,int> charMap;
};int main(){Solution so;char c[]="google";for(int j=0;j<sizeof(c)-1;j++){so.Insert(c[j]);//一个个输入字符流}cout<<so.FirstAppearingOnce()<<endl;return 0;
}

输出:

string类的源码,重载的+运算符可以对string和char类型进行相加:

string& operator+= ( const string& str );

1.map<key, value>的定义及插入

map是STL的一个关联容器,它提供一对一的hash。第一个可以称为关键字(key),每个关键字只能在map中出现一次,第二个可能称为该关键字的值(value),定义如map<key, value> M。

结构

value_type、key_type、mapped_type类型:

map<string, int>::key_type  s; //此时key的实例s的类型key_type 是string
map<string, int>::mapped_type  num; //此时value的实例num类型mapped_type 是int
map<string, int>::value_type  m; //此时map的实例m的类型value_type是pair<const string, int>,注意pair键值对中第一个元素的类型有const(不可修改).

key_type就表示map中key的类型。以下两句是一个意思:
map<string, int>::key_type s;
string s;

使用语法:

//定义:
#include <map>  //注意,STL头文件没有扩展名.h
using namespace std;//std::map
map<int, string> mapStudent;
//插入:
mapStudent.insert(pair<int, string>(0, "Lwx"));
mapStudent.insert(map<int, string>::value_type(1, "Crisp"));
mapStudent[2] = "Doinb";
map<int,string> intmap={ {4,"Tian"}, {5,"GimGoon"} };

2.map的value获取及遍历

用迭代器遍历:begin()返回指向首元素的迭代器,end()返回指向尾元素下一个位置的迭代器(不是指向尾元素!)

//通过key获取value:
value =mapStudent[key];
//遍历
map<int, string>::iterator iter; //使用 * 访问迭代器所指向的元素
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)cout<<iter->first<<' '<<iter->second<<endl; 

3.查找find(key)

find()返回的是被查找元素的位置,没有则返回map.end()的位置

map<int,string>::iterator it;
it = mapStudent.find(1);
if(it != mapStudent.end()){cout<<"Find, the value is: "<<it->second<<endl;mapStudent.erase (it);
}

查找删除后遍历mapStudent:

4.计数count(key)

count()返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。

cout<<mapStudent.count(1)<<endl;
cout<<mapStudent.count(6)<<endl;

遍历mapStudent后count:

解法二.队列

一个128大小的数组a[]记录字符出现次数,一条队列q保存字符串。依次获取队首,判断其次数,将队列中出现过两次及以上的字符弹出。

#include<iostream>
using namespace std;
#include<queue>class Solution
{
public:queue<char> q;int a[128]={0};//获得队列google;数组a[g],a[o],a[l],a[e]分别为2211void Insert(char ch){q.push(ch);a[ch]++;//ch被强制为整型ch-'\0'cout<<"ch="<<ch<<"  a[ch]=a["<<ch-'\0'<<"]="<<a[ch]<<endl;}//依次获取队首判断其次数,将队列中出现过两次及以上的字符弹出char FirstAppearingOnce(){while(!q.empty()&&a[q.front()]>1){//a[111]>1cout<<"弹出"<<q.front()<<endl;q.pop();//弹出goog}if(q.empty())return '#';elsereturn q.front();}};int main(){Solution so;char c[]="google";for(int j=0;j<sizeof(c)-1;j++){so.Insert(c[j]);//一个个输入字符流}cout<<so.FirstAppearingOnce()<<endl;return 0;
}

输出:

1.队列

先进先出;push到队尾;pop队首元素

定义一个queue对象       queue<Type> M
查看是否为空            M.empty()    是的话返回1,不是返回0;
从队尾增加元素          M.push(x)
弹出第一个元素          M.pop()
输出现有元素个数        M.size()
显示队首元素            x=M.front()
显示队尾元素            x=M.back()

2.char以及opencv的waitKey()

char:

ch='value'的值是字符'value'的ascii码值。'0'~'9'在 ASCII 表中是第48~57个。把char ch='0','1'...'9'转换为int a=0...9需要ch-48,即ch-'0',也就是int a=ch-'0'。

例:

  • char ch='9'; //也就是ch=57
  • int a=ch-'0'; //也就是a=57-48=9,这样就是把 char字符 转成 int 数字了

waitKey(delay):

  • waitKey()与waitKey(0),默认int delay = 0,代表图像显示时的无限等待,直到任何按键按下
  • waitKey(n),等待n毫秒后,关闭显示的窗口
  • 等待时间内无任何操作时,等待结束后返回-1;等待时间内有输入字符时,返回输入字符的ASCII码对应的十进制值
#include <iostream>
#include <opencv2/opencv.hpp>
char c=cv::waitKey();
//视频流中按p可暂停,按g键继续
if(c=='p') {while(c!='g'){c=cv::waitKey(20);//继续}
}
//若不按空格一直循环(waitKey(1)为等待1ms,加上while循环即无限等待,当输入字符则waitKey()返回当前字符的ASCII码对应的十进制值,然后char()将其转换为字符判断是否与键入值对等,若键入空格则停止循环
while (char(waitKey(1)) != ' ') {}//不加char也能自动转换

3.C++中char和string

  • char是一个原始类型,存储一个字符,占一个字节,用单引号,例如:‘6’,’A’。要表示多个字符就用字符数组char[],如char ch1[] = "give me"。
  • string是#include <string>中的一个class。用双引号,如string str1 = "give me"。string中每个字符都用2个字节保存,最后还有一个特殊的字符,是不可见的,它也是占两个字节。string的长度是无法明确取得的,也就是无法通过sizeof来取得,因为它不是一个基础类型,它本身并不固定长度,而取决于内部包含的字符。

(1)char[]和char*区别:

//定义
string str1 = "give me";
char ch1 = 'c';
char ch2[8];char ch[]= "give me";
char* p = ch;//相当于char* p = "give me";//赋值 (这里P与ch都是char型的指针)
p[0] = 'a';
ch[1] = 'b';
ch[2] = ch1;//取值
cout<<*p<<' '<<*ch<<'\n'<<endl;
for(int j=0;j<sizeof(ch)-1;j++){cout<<ch[j]<<' '<<p[j]<<endl;
}

(2)sizeof()、strlen()、length()、size()

sizeof()、strlen()、length()、size()详解和区别:https://blog.csdn.net/z_qifa/article/details/77744482

A.sizeof()

  • sizeof()是运算符,用来获得保证能容纳实现所建立的最大对象的字节大小。可以用类型做参数,获取基本类型的大小。其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。
  • 用sizeof(a)可以计算出数组的字节大小(不是数组元素数量,是元素数量*元素类型所占字节),但sizeof(p)是一个指针变量的字节数,而不是p所指的内存容量。

B.strlen(char*)

  • sizeof()是函数,要在运行时才能计算。参数必须是字符型指针(char*),且必须是以''\0''结尾的。当数组名作为参数传入时,实际上数组就退化成指针了。它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符'\0'。返回的长度大小不包括'\0'。strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。
  • <string.h>是不包括strlen的,要使用cstring

C.对于字符串

  • 对于字符串,sizeof(str)永远是24,strlen()和str.length()和str.size()都可以求字符串长度。
  • strlen()是用于求字符数组的长度,其参数是char*,需要用strlen(str.c_str())或strlen(str.data())。
  • str.length()和str.size()是用于求string类对象的成员函数,str.length()只是用来获取字符串的长度,size()函数还可以获取vector类型的长度。
#include <iostream>
#include<vector>
#include<cstring>
using namespace std;int main(){
/*----sizeof()是总空间的字节----*/short f();cout<<sizeof(char)//1<<" "<<sizeof(char*)//4<<" "<<sizeof(int)//4<<" "<<sizeof(int*)//4<<" "<<sizeof(short)//2<<" "<<sizeof(long)//4<<" "<<sizeof(float)//4<<" "<<sizeof(double)//8<<" "<<sizeof(string)//24<<" "<<sizeof(f())//2,即sizeof(short)<<'\n'<<endl;char ch[]= "hi boy";char c1[40] = "hi boy";char* p = ch;int a[] = {1,2,3,4,5,6};int* pa = a;string str = "hi boy";cout<<sizeof(ch)//7,以'0'结尾加进去<<" "<<sizeof(*ch)//1,*ch第一个字符<<" "<<sizeof(c1)//40<<" "<<sizeof(p)//4,即sizeof(char*)<<" "<<sizeof(*p)//1,ch的第一个字符大小为1<<" "<<sizeof(a)//24,a是数组,但不需计算到'\0',结果为6*4=24<<" "<<sizeof(a[0])//4,a[0]为int型的1,即sizeof(int)<<" "<<sizeof(*a)//4,*a指向a的第一个数字,即sizeof(int)<<" "<<sizeof(pa)//4,即sizeof(int*)<<" "<<sizeof(*pa)//4,*pa指向a的第一个数字,即sizeof(int)<<" "<<sizeof(str)//24,字符串总空间的字节<<'\n'<<endl;/*----strlen参数必须是字符型指针char*----*/cout<<strlen(ch)//6<<" "<<strlen(c1)//6<<" "<<strlen(p)//6//<<" "<<strlen(*p)//error//<<" "<<strlen(a)//error//<<" "<<strlen(pa)//error//<<" "<<strlen(*pa)//error<<'\n'<<endl;/*----字符串专用str.length()和str.size()----*/string str1 = "hi boy";vector<int> v={1,2,3,4,5,6,7};cout<<sizeof(str1)//24<<" "<<sizeof(v) //12<<" "<<strlen(str1.c_str())//6<<" "<<strlen(str1.data())//6<<" "<<str1.length()//6<<" "<<str1.size()//6<<" "<<v.size()//7<<endl;//c_str()返回char*类型(返回字符串的首指针地址),c_str()字符串后有'\0',而data()没有,data返回是数组?return 0;
}

(3)char*、char[ ]、string转换

char*或char[]转string:

char *p = "hello";
string str(p,size); //size是p的大小
string str=p;

string转char*:

string str="hello";
const char *p = str.data(); //加const  或用 char *p = (char*)str.data(); 的形式
const char *p = str.c_str(); //同上

string转char[]:

string str = "hello";
char p[8];//为啥要是8呢?不懂
for(int i=0; i<str.length(); ++i)//str.length()是5
{p[i] = str[i];
}
p[str.length()] = '\0'; //这一步比较重要

找出google字符流中第一个只出现一次的字符(map/queue)相关推荐

  1. 找第一个只出现一次的字符_剑指offer 字符流中第一个只出现一次的字符

    题目描述: 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是'g'.当从该字符流中读出前六个字" ...

  2. 【Java】 剑指offer(50-2) 字符流中第一个只出现一次的字符

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字 ...

  3. 算法试题 - 找出字符流中第一个不重复的元素

    题目 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时, 第一个只出现一次的字符是"g".当从该字符流中 ...

  4. 剑指offer:字符流中第一个不重复的字符

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  5. [剑指offer] 字符流中第一个不重复的字符

    本文首发于我的个人博客:尾尾部落 题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是" ...

  6. 字符流中第一个不重复的字符 python实现

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  7. 字符流中第一个不重复的字符

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  8. 《剑指offer》-- 第一个只出现一次的字符、数组中只出现一次的数字、字符流中第一个不重复的字符、数组中重复的数字

    一.第一个只出现一次的字符: 1.题目: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写 ...

  9. 面试题55 字符流中第一个不重复的字符

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

最新文章

  1. Kubernetes集群监控方案
  2. 聚集索引和非聚集索引
  3. mysql与mimic安装_MIMIC专题 | MIMIC数据库的安装
  4. CF思维联系–CodeForces - 223 C Partial Sums(组合数学的先线性递推)
  5. jenkins发送邮件
  6. JavaScript通用表单验证函数
  7. 母婴玩具进销存软件怎么挑?这份名单,95%的老板都在偷偷参考!
  8. 陀螺仪工作原理,你懂了吗?
  9. Mybatis 异常(SQL 语法异常 ambiguous)
  10. 从0开始学大数据(一)
  11. Zencart完美程序来了,首个Zencart模板引擎来了
  12. 备案服务器查询网站,网站服务器备案查询
  13. H5动画实现---过渡
  14. 服务器centos系统诛仙,云服务器搭建诛仙教程
  15. 【UVM基础】UVM 的 build_phase 执行顺序
  16. 【单片机笔记】集USB充电、USB供电和电池供电的电源设计
  17. 如何利用pyecharts绘制酷炫的桑基图?
  18. MySQL数据恢复(通过.frm和.idb文件)
  19. 第一周 一起走进摄影世界
  20. 分号与逗号的区别及举例_怎样区别顿号、逗号和分号

热门文章

  1. RPM(红帽软件包管理器)详解
  2. 《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:04 预处理
  3. C#设计模式之原型模式
  4. [模板] BSGS/扩展BSGS
  5. Vans携手洛杉矶现代艺术博物馆推出联名系列;关晓彤代言艾莱依羽绒服 | 知消...
  6. ManytoMany字段增删改查Django
  7. Ubuntu重启X的方法
  8. Realtime Data Processing at Facebook
  9. 2019世界人工智能博览会-优选展览会
  10. 招行就是有前途——行长马蔚华年薪居各行之首