实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符。如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])
1 回答

当年话下
TA贡献1890条经验 获得超9个赞
const less = (x, y) => x.count <= y.count && x.first < y.firstfunction firstSingle (string) { let map = {} string.split('') .forEach((char, index) => { if (map[char]) map[char].count++ else map[char] = { count: 1, first: index, char } }) return Object.values(map).reduce((x, y) => less(x, y) ? x : y).char }
思路相似,利用Hash Table,并引入了index解决顺序问题。
ES2017还没有正式发布,Object.values
目前还是草案。
重新排个版:
const less = (x, y) => (x.count <= y.count && x.first < y.first) ? x : y;function firstSingle (string) { let map = {} string.split('') .forEach((char, index) => { map[char] ? map[char].count++ : map[char] = { count: 1, first: index, char } }); return Object.values(map).reduce(less).char}
添加回答
举报
0/150
提交
取消