算法笔记----只出现一次的字符 _C++

只出现一次的字符

问题描述:

给你一个只包含小写字母的字符串;
请你判断是否存在只在字符串中出现过一次的字符;
如果存在,则输出满足条件的字符中位置最靠前的那个;
如果没有, 输出 no.

输入格式:

共一行, 包含一个由小写字母构成的字符串;
数据保证字符串的长度不超过 100000.

输出格式:

输出满足条件的第一个字符;
如果没有, 则输出 no.

思路分析

  • 思路一

    首先, 使用哈希表, 将每一个字符都存到哈希表中,

    其次, 对哈希进行循环判断, 只要有第一个哈希值为1的, 直接返回该字符. 遍历到最后没有值为1的, 即返回 ‘no’ .

  • 思路二

    使用哈希和双指针, 双指针都指向首个字符串, 每存放一个字符, 对第一个指针对应的哈希值进行判断, 如果大于1, 这时说明存放进去的字符有重复, 此时对第二个指针指向的字符(即第一个字符)进行哈希值判断, 如果等于1, 那么说明此字符不是重复的字符, 直接continue, 让第二个指针不变.

    如果第二指针对应的哈希值大于1, 进行while循环, 即寻找哈希值为1对应的字符, 如果没有那么返回一个标志, 该标志对应输出’no’; 该循环内, 只要第二指针对应的哈希值不等于1, 那么指针后移, 直到遍历结束.

    继续进行字符串的一位一位存放, 依次进行判断

代码实现

//	思路一代码实现
using namespace std;

int main()
{
    int     flag = 0;
    string 	str;
    getline(cin,str);
    
    unordered_map<char, int> hash;
    int i = 0, j = 0;
     
    for(i=0, j=0; j<str.size(); j++)
    {
        hash[str[j]]++;
    }
     
    for(i=0; i<str.size(); i++)
    {
        if(hash[str[i]] == 1)
        {
            flag = 0;
            break;
        }
        flag =1;
    }
        
    if(flag == 0)
    {
        cout << str[i] <<endl;
    }
    else
    {
        cout << "no" << endl;
    }
}
// 	思路二代码实现
using namespace std;

int main()
{
    string str;
    getline(cin,str);
    
    unordered_map<char, int>hash;
    int i = 0, j = 0, flag =0;

    for(i=0, j=0; i<str.size(); i++)
    {
        hash[str[i]]++;
        if(hash[str[i]] > 1)
        {
            if(hash[str[j]] == 1)
            {
                continue;
            }
            else
            {
                while(hash[str[j]] != 1 && j < i)
                {
                    j++;
                    flag =0;
                    if(str[j] == str[i])
                    {
                        flag = 1;
                    }
                }
            }
        }
        
    }
    
    if(flag == 0)
    {
        cout << str[j] <<endl;
    }
    else
    {
        cout << "no" << endl;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值