为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

DIEA 2018-11-14 10:17:07
实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符。如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}


查看完整回答
反对 回复 2018-12-08
  • 1 回答
  • 0 关注
  • 804 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号