面试题-------编程题---找到字符串中第一个只出现一次的那个字符

找到字符串中第一个只出现一次的那个字符

题目描述:

输入描述:
输入一个非空字符串



输出描述:
输出第一个只出现一次的字符,如果不存在输出-1

示例1
输入
asdfasdfo
输出
o

思路:

1:我们首先定义一个哈希表,哈希表的key值是字符,而值val则是该字符出现的次数;

2:然后我们需要对该字符串进行两次扫面,第一次是从头进行扫描,每次扫描到一个字符,就在哈希表的对应的位置将次数加1,然后进行第二次扫描,每次扫描到一个字符,就能从哈希表中得到该字符出现的次数,然后就能求得只出现一次的字符。

注:getline函数的作用,请参考网址:http://www.cplusplus.com/reference/string/string/getline/

cin函数的作用:

cin>>a;键盘读入数据赋值给a;

cin:C++编程语言互换流中的标准输入流,需要iostream.h支持,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。

具体作用请参考网址:http://www.cplusplus.com/reference/iostream/cin/

下面是我在牛客网oj环境下编译通过所有测试的代码:

这个是我用哈希表写出来的代码:

#include<iostream>
#include<string>
using namespace std;
const int tableSize = 256;
int hasTable[tableSize];
int main(){
    string s;
    while(getline(cin,s)){
        bool flag = false;
        for(int i=0;i<tableSize;++i) hasTable[i]=0;
        for(int i=0;i<s.size();++i) hasTable[s[i]]++;
        for(int i=0;flag!=true && i<s.size();++i){
            if(hasTable[s[i]] == 1){
                cout<<s[i]<<endl;
                flag = true;
                break;
            }
        }
        if(flag==false)//如果没有找到
            cout<<"-1"<<endl;
    }
    return 0;
}
#include<iostream>
#include<string>
using namespace std;
int main()
{
    string str;
    while(getline(cin,str))//作用是从istream中读取至多n个字符保存在s对应的数组中
    {
        int a[128]={0};//保存出现次数
        bool flag=false;//判断是否找到
        for(int i=0;i<str.size();++i)
            ++a[str[i]];
        for(int i=0;i<str.size();++i)
        if(a[str[i]]==1)//判断是否是第一个只出现一次的字符
        {
             cout<<str[i]<<endl;
             flag=true;
             break;//注意要break;
        }
        if(flag==false)//如果没有找到
            cout<<"-1"<<endl;
    }
    return 0;
}

 

测试用例

猜你喜欢

转载自blog.csdn.net/pigdwh/article/details/81989567