美文网首页
剑指 offer 笔记 34 | 第一个只出现一次的字符位置

剑指 offer 笔记 34 | 第一个只出现一次的字符位置

作者: ProudLin | 来源:发表于2019-11-04 17:44 被阅读0次

    题目描述
    在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)

    思路分析
    其实主要还是 hash ,利用每个字母的 ASCII 码作 hash 来作为数组的 index。

    首先用一个 58 长度的数组来存储每个字母出现的次数,为什么是 58 ?

    主要是由于 A-Z 对应的 ASCII 码为 65-90,a-z 对应的 ASCII 码值为 97-122 ,而每个字母的 index = int(word) - 65。

    而且 ASCII 码中的 90-96 不是字母,但是为了统一减 65 来计算,所以要再加上 6 个长度,不然就要判断是否是小写字母 ,小写字母要减 65 再减 6。

    比如 g =103-65=38,而数组中具体记录的内容是该字母出现的次数,最终遍历一遍字符串,找出第一个数组内容为 1 的字母就可以了,时间复杂度为 O(n)

    解释说明:

    public class Solution {
        public int FirstNotRepeatingChar(String str) {
           int[ ] words = new int[ 58 ];
            
        for(int i = 0; i < str.length(); i++){
          //第一次遍历,记录出现的次数
            words[( (int)str.charAt(i) ) - 65 ] + = 1;
        }
            
        for(int i = 0; i< str.length(); i++){
            //第二次遍历,判断是否第一次出现且为 1 次
            if( words[ ( (int)str.charAt(i) ) - 65 ] == 1 )
                return i;
        }  
        return -1;
        }
    }
    

    链接:https://www.nowcoder.com/questionTerminal/1c82e8cf713b4bbeb2a5b31cf5b0417c?f=discussion
    来源:牛客网

    相关文章

      网友评论

          本文标题:剑指 offer 笔记 34 | 第一个只出现一次的字符位置

          本文链接:https://www.haomeiwen.com/subject/sibdbctx.html