LeetCode——剑指 Offer 50. 第一个只出现一次的字符

剑指 Offer 50. 第一个只出现一次的字符

题目

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
限制:

0 <= s 的长度 <= 50000

思路

要找出第一次只出现一次的字符,你至少要知道每个字符的出现次数,因为还要找到第一次出现的,所以,还得记录下他们出现的次数。

因为题目里面,字符串s是一个只含有小写子母的字符串,也有可能是空串。这个剔除一下就好了。

我们利用一个队列来记录他们出现的先后顺序,利用一个数组来记录他们出现的次数。

然后,将队列的字符逐一弹出,判断它所对应的次数是不是一次即可。

代码

//找出第一个出现一次的字符
class Solution {
    public char firstUniqChar(String s) {
        if (s.length()==0)
            return ' ';
        int isApperar[]=new int[26];
        Queue <Character> queue=new LinkedList<>();
        int length=s.length();
        int temp=0;
        for (int i=0;i<length;++i)
        {
            temp=(s.charAt(i)-97);
            if (isApperar[temp]==0)//第一次出现,入队
            {
                queue.offer(s.charAt(i));//按照出现次序入队
                ++isApperar[temp]; //出现了
            }
            else
                ++isApperar[temp];//多次出现,就计算次数就好了
        }

        char result=' ';// 空白字符
        while (!queue.isEmpty())//队列不为空
        {
            if (isApperar[queue.peek()-97]==1) //刚刚好记录的次数是1
            {
                result=queue.poll();
                break;
            }
            else
                queue.poll();//弹出出现次数不为1的值
        }
        return result;

    }
}

结果

在这里插入图片描述
简单题来的,就懂得使用一个队列就可以了,其他的,没什么难度。

想法

看到题解还有人使用哈希表来计数,这样太慢了,用数字计数最多也就开一个长度为26的数组,而且,计数也简单。用哈希表太麻烦了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值