牛客剑指Offer面试题50:第一个只出现一次的字符(题目1:字符串中第一个只出现一次的字符)

题目描述

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

思路

1.自己创建一个简单的哈希表(即建立一个数组,数组下标为各字符对应的ASCII值,数组值为字符在给定字符串中出现的次数)
2.两次遍历哈希表(第一次遍历:记录给定str中各字符出现次数; 第二次遍历:寻找是否有次数为1的字符,有则返回)

注意
1.当字符作为数组的下标索引时,自动转换为该字符对应的ASCII值(int 型数字)
2.如果按照书中的已知条件,要求返回char型结果,则要用char* 型指针pHashKey来遍历数组,找到次数为1的字符时,返回*pHashKey 则为char型结果
3.书中说如需要复杂的哈希表功能可直接用C++STL中的map和unordered_map

代码

class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        //判断有效性
        if(str.empty())
            return -1;
        //创建一个长度256的数组作为哈希表
        const int tableSize = 256;
        int hashTable[tableSize];
        //数组各元素初始化为0
        for(int i = 0; i < tableSize; ++i)
            hashTable[i] = 0;
        //指示字母位置的游标
        int index = 0;
        //统计给定str中各自符出现次数并将各字符次数保存在哈希表中
        while(str[index] != '\0')
            hashTable[str[index++]]++;
        //再从头遍历哈希表,找到第一个次数为1的字符
        index = 0;
        while(str[index] != '\0')
        {
            if(hashTable[str[index]] == 1)
                return index;
            index++;
        }
        //没找到
        return -1;
    }
};
发布了65 篇原创文章 · 获赞 0 · 访问量 2036

猜你喜欢

转载自blog.csdn.net/ljmiiianng/article/details/103792829