当面试官问:在字符串里找出出现最多次的字符?

119 阅读1分钟

用reduce能最优雅的解决

// 在字符串中找出出现最多的字符
const str = "aabdhxjdhdddnxsbbbadsh";
const maxArr = str.split('');
const maxRes = maxArr.reduce((prev, next) => {
   if (next in prev) {
       prev[next]++;
   } else {
       prev[next] = 1;
   }
   return prev;
}, {});
console.log(maxRes);

类似的

// 计数,一个数字出现的次数
const arrayCounter = [2,3,5,78,9,6,5,3,2,5,3,4,5,34,54,3,45,3];
const numCounter = 3;
const resCounter = arrayCounter.reduce((prev, next) => {
    if (numCounter == next) {
        prev++;
    }
    return prev;
}, 0)
console.log(resCounter);

还有些常见的,看见了不用想reduce一把梭

// 函数的柯里化

// 函数的柯里化
const curry = (fn, arr = []) => {
    return (...args) => (param => {
        return param.length == fn.length ? fn(...param) : curry(fn, param)
      })([...arr, ...args])
}
const plus = curry((a,b,c) => a+b+c);
console.log(plus(9)(2)(5));

// 数组的扁平化

// 数组的扁平化
    const flatFn = (array) => {
        return array.reduce((prev, next) => {
            return prev.concat(Array.isArray(next) ? flatFn(next) : next)
        }, [])
    }
    const flatRes = flatFn([1,2,[3,4,[5]]]);
    console.log(flatRes);
// 找出出现奇数次的数字
    const arrOdd = [2,5,6,5,6,8,8,8,8,9,9];
    const newArrOdd = arrOdd.reduce((prev, next) => {
      if (prev[next]) {
        prev[next]++;
      } else {
        prev[next] = 1;
      }
      return prev;
    }, {});
    console.log(Object.keys(newArrOdd).find(el => newArrOdd[el]%2 != 0));

还有些简单的

// 倒序
const reverseRes = arr.reduce((prev, next) => {
    prev.unshift(next);
    return prev;
}, []);
console.log(reverseRes);
// 累加
let arr = [1,2,3,4,5];
const addRes = arr.reduce((prev, next) => {
    return prev + next;
}, 10);
console.log(addRes);
// 数组去重
    const arrRepeat = [1,3,4,6,4,35,3,32,32,3,4,4,43];
    const newArrRepeat = arrRepeat.reduce((prev, next) => {
      if (prev.indexOf(next) == -1) {
        prev.push(next)
      }
      return prev;
    }, []);
    console.log(newArrRepeat);