算法题:剑指 Offer 50. 第一个只出现一次的字符 时空 3ms击败99.35%用户 一次AC(题目+思路+代码+注释)

在这里插入图片描述

题目

剑指 Offer 50. 第一个只出现一次的字符
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

示例 1:

输入:s = “abaccdeff”
输出:‘b’
示例 2:

输入:s = “”
输出:’ ’

限制:

0 <= s 的长度 <= 50000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

特殊情况字符串为空或者长度为0则直接返回结果

首先考虑有没有一次遍历就能计算出结果的办法,位运算的话,没有办法解决,因为不止一个奇数个,因此没办法利用aba=b特性,那就拆解问题,既然要找第一个只出现一次的字符,那我们可以分为两件事,第一件事是遍历一边把每个字符出现的次数计数,第二件事是遍历这个字符串的每个字符,找到第一个计数为1的字符并返回,如果没有找到则返回默认的’ ‘。而计数的话,由于题目说了只有小写字符,因此只有26个字符,可以定义一个整数数组,利用ASCII码来巧妙计算,以下标0代表字符’a’,最后一个代表’z’,计算的时候用字符c-'a’即可计算出数组的下标,对该数自增,即可只使用26个整数完成计数(由于题目说s长度0到5万我们不可用byte直接用int就行,个数少,没关系的)

代码

class Solution {
    public char firstUniqChar(String s) {
        if (s == null || s.length() == 0) {
            return ' ';
        }
        //题目说了只有小写字母
        int[] array = new int[26];
        char[] chars = s.toCharArray();
        //字母计数
        for (char c : chars) {
            array[c - 'a']++;
        }
        //遍历字母,看是不是只有一个
        for (char c : chars) {
            if (array[c - 'a'] == 1) {
                return c;
            }
        }
        return ' ';
    }
}
posted @ 2022-03-24 18:40  HumorChen99  阅读(0)  评论(0编辑  收藏  举报  来源