题目:
2017/3/16 16:11 更新
非常感谢各位大大的回答,真的非常感动,每个答案我会一个一个看过去,正在努力学习中...
实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符。如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])
斗胆来评价一下诸位大神的答案。。。
@莲_涳栢__ :
正统的Hash Table思路。缺点是Object.keys()不能保证顺序,所以存在风险。
@边城 :
引入了index来解决顺序问题,比较健康和简练。
@u3u
利用数组代替Hash Table,解决了顺序问题,思路不错。
但是Array.sort()并不一定是stable的,这个造成的风险更大。
@hsfzxjy
思路相似,利用Hash Table,并引入了index解决顺序问题。
ES2017还没有正式发布,
Object.values
目前还是草案。另外原谅我强迫症重新排个版:
最后是我的two cents: