猿问

做了一题JS面试题,写的很不好,寻求更好的方法

实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符。如cbaacfdeaebb,符合要求的是f,因为他只出现了一次(次数最少)。并且比其他只出现一次的字符(如d)首次出现的位置最靠前。

下面是我的写法,小弟没学过数据结构与算法,半路出家,基础不好,写的太烂了,效率无比低下,希望有各位大大能够给出一些更好的写法。

我的写法:

var str = "cbaacfdeaebb";

var arr = str.split('');


// 各元素以及对应出现的次数

var res = arr.reduce(function (obj, key, index, arr) {

    if(obj.hasOwnProperty(key)) {

        obj[key] ++;

    } else {

        obj[key] = 1;

    }

    return obj;

}, {}); 


// 次数组成的数组

var indexArr = []; 


for(var prop in res) {

    indexArr.push(res[prop]);    

}


// 找出出现次数最少的数

var minTimes = Math.min.apply(null,indexArr);


// 出现次数最少元素的数组

var eleArr = [];


for(var p in res) {

    if(res[p] === minTimes) {

        eleArr.push(p); 

    }

}


console.log(eleArr[0])


DIEA
浏览 805回答 1
1回答

当年话下

const&nbsp;less&nbsp;=&nbsp;(x,&nbsp;y)&nbsp;=>&nbsp;x.count&nbsp;<=&nbsp;y.count&nbsp;&&&nbsp;x.first&nbsp;<&nbsp;y.firstfunction&nbsp;firstSingle&nbsp;(string)&nbsp;{&nbsp;&nbsp;let&nbsp;map&nbsp;=&nbsp;{}&nbsp;&nbsp;string.split('') &nbsp;&nbsp;&nbsp;&nbsp;.forEach((char,&nbsp;index)&nbsp;=>&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(map[char])&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[char].count++&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[char]&nbsp;=&nbsp;{&nbsp;count:&nbsp;1,&nbsp;first:&nbsp;index,&nbsp;char&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;})&nbsp;&nbsp;return&nbsp;Object.values(map).reduce((x,&nbsp;y)&nbsp;=>&nbsp;less(x,&nbsp;y)&nbsp;?&nbsp;x&nbsp;:&nbsp;y).char }思路相似,利用Hash Table,并引入了index解决顺序问题。ES2017还没有正式发布,Object.values目前还是草案。重新排个版:const&nbsp;less&nbsp;=&nbsp;(x,&nbsp;y)&nbsp;=>&nbsp;(x.count&nbsp;<=&nbsp;y.count&nbsp;&&&nbsp;x.first&nbsp;<&nbsp;y.first)&nbsp;?&nbsp;x&nbsp;:&nbsp;y;function&nbsp;firstSingle&nbsp;(string)&nbsp;{ &nbsp;&nbsp;let&nbsp;map&nbsp;=&nbsp;{} &nbsp;&nbsp;string.split('') &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEach((char,&nbsp;index)&nbsp;=>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[char]&nbsp;?&nbsp;map[char].count++&nbsp;:&nbsp;map[char]&nbsp;=&nbsp;{&nbsp;count:&nbsp;1,&nbsp;first:&nbsp;index,&nbsp;char&nbsp;}&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;return&nbsp;Object.values(map).reduce(less).char}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答