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

91 阅读1分钟

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

求出字符串只是出现一次的字符,其他字符串有可能出现多次,如果找不到,就返回" "

下面是一个十分好理解的代码,请看注释

var firstUniqChar = function(s) {
    if(!s){//如果是空字符 则返回空字符穿
        return " "
    }
    var obj ={}
    var hArr = []//黑名单
    for(var i =0;i<s.length;i++){
        if(obj[s[i]] === undefined && !hArr.includes(s[i])){// 录入obj内的key 不能是黑名单内的key
            obj[s[i]] = 1
        }else{
            delete obj[s[i]] // 删除不符合要求的key
            hArr.push(s[i]) // 出现两次了 里面进入黑名单
        }
    }
    var arr = Object.keys(obj) //  如果都是重复的字符串,则没有符合要求的key
    if(arr.length){ // 有符合要求的  则返回第一个
        return Object.keys(obj)[0]
    }else{// 没有返回的  则返回空字符串
        return " "
    }
};

方法二 使用Map结构 下面是Set 和 Map学习图片 可以先学习下

image.png

代码实现如下

const firstUniqChar = str => {
    if (!str) return ' ';
    const m = new Map();
    for (const s of str) { // 字符串的for-of循环
        m.set(s, (m.get(s) || 0) + 1);
    }
    for (const s of m) { // Map结构的for-of循环  s结构为[key,value]
        if (s[1] === 1) return s[0];
    }
    return ' ';
};