面试题50. 第一个只出现一次的字符

题目描述
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

示例:

s = “abaccdeff”
返回 “b”

s = “”
返回 " "

class Solution {
public:
    char firstUniqChar(string s) {

        //if(s == "") return ' ';

        /*
        int i = 0;
        unordered_map <char,int> Charmap;

        while(s[i])
        {

            Charmap[s[i]]++;
            i++;
        }

        i = 0;
        while(s[i])
        {
            if(Charmap[s[i]] == 1) return s[i];
            i++;
        }

        return ' ';
        */
        //vector<int> hash(128,0); //定义一个长度为128的Int类型数组,初始化值为0
        int hash[128] = {0};

        for(char c:s) hash[c]++; //若确定字符均为字母,可定义26大小的数组空间,ch-'a'为键值
        for(char c:s) if(hash[c] == 1) return c;

        return ' ';

        
    }
};

//为什么用数组会快得多?int hash与vector hash与unorderedmap与map的速度比较
//用vector定义和int arr[128] = 0{}和int [] arr = new int[128]定义哪个好?

//优化思路1:Java中提供了LinkedHashMap,能使得遍历的顺序和插入数据的顺序保持一致,使用该hashmap可使长字符串多重复字符的情况下,第二遍遍历时间大大缩减,C++没有这种map。
//优化思路2:ASCII字符最大十进制数值为126,使用固定长度128的数组当hash表,可以缩减空间复杂度。
//优化思路3:unordered_map比map查找更快。
//优化思路4:使用count方法判断键值对是否存在,存在(出现过的字符)则将其值置为0,不存在将其置为1。用bool值判断出现次数更节省空间。

//unordered_map与map的区别
//遍历字符串的新写法for(char c:s);
//常量空间,空间复杂度为O(1),即使是引入了新的空间也是O(1)。所以自定义128大小数组存储键值对可以缩减空间复杂度。
//c++定义数组的写法?
//vector定义数组的写法和好处?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值