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的数组,而且,计数也简单。用哈希表太麻烦了!

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页