前端面试手写代码——查找文章中出现频率最高的单词

查找文章中出现频率最高的单词

//   方法一:
const fn = (str) => {
  if (!str) return;
  // 去掉空格和全部单词变小写,如果区分大小则不用 toLowerCase
  const article = str.trim().toLowerCase();
  // 用正则的 match 获取所有的单词
  const list = article.match(/[a-zA-Z]+/g);
  const map = {};
  // 记录每个单词和对应的出现次数
  list.forEach((item) => {
    let count = 1;
    if (Object.prototype.hasOwnProperty.call(map, item)) {
      count = map[item] + 1;
    }
    map[item] = count;
  });
  let maxItem = { maxWord: "", maxNum: 0 };
  // 查找出现次数最多的单词
  for (let item in map) {
    if (Object.prototype.hasOwnProperty.call(map, item)) {
      if (map[item] > maxItem?.maxNum) {
        maxItem = { maxWord: item, maxNum: map[item] };
      }
    }
  }
  return maxItem;
};

//   【优化】方法一
const _fn = (str) => {
  if (!str) return;
  // 去掉空格和全部单词变小写,如果区分大小则不用 toLowerCase
  const article = str.trim().toLowerCase();
  // 用正则的 match 获取所有的单词
  const list = article.match(/[a-zA-Z]+/g);
  const map = {};
  let maxItem = { maxWord: "", maxNum: 0 };
  // 记录每个单词和对应的出现次数
  list.forEach((item) => {
    let count = 1;
    if (Object.prototype.hasOwnProperty.call(map, item)) {
      count = map[item] + 1;
    }
    map[item] = count;
    if (count > maxItem?.maxNum) {
      maxItem = { maxWord: item, maxNum: count };
    }
  });
  return maxItem;
};

//   方法二:
function findMostWord(article) {
  // 合法性判断
  if (!article) return;
  // 参数处理
  article = article.trim().toLowerCase();
  let wordList = article.match(/[a-z]+/g),
    visited = [],
    maxNum = 0,
    maxWord = "";
  article = " " + wordList.join("  ") + " ";
  // 遍历判断单词出现次数
  wordList.forEach(function (item) {
    if (visited.indexOf(item) < 0) {
      // 加入 visited
      visited.push(item);
      let word = new RegExp(" " + item + " ", "g"),
        num = article.match(word).length;
      if (num > maxNum) {
        maxNum = num;
        maxWord = item;
      }
    }
  });
  return { maxWord, maxNum };
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值