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

题目描述
在一个字符串(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 | 第一个只出现一次的字符位置)