[前端经典题目]——字符串处理类(2)

[前端经典题目]——字符串处理类(2)

1、查找一篇英文文章中出现频率最高的单词

题目描述

查找一篇英文文章中出现频率最高的单词,输出该单词及出现个数。

代码

function findMostWord(article) {
  // 合法性判断
  if (!article) return;
  // 参数处理
  article = article.trim().toLowerCase();
  //拆分单词
  let wordList = article.match(/[a-z]+/g);
  //重新拼接文章,此时文章中每个单词直接有空格隔开
  article = " " + wordList.join("  ") + " ";
  let wordListSet = new Set(), //把已经查询过的单词放入 Set 中,避免重复查询。
    maxNum = 0,
    maxWord = "";

  wordList.forEach((item) => {
    if (!wordListSet.has(item)) {
      wordListSet.add(item);
      let world = new RegExp(" " + item + " ", "g"),
        num = article.match(world).length;
      if (num > maxNum) {
        maxNum = num;
        maxWord = item;
      }
    }
  });
  return maxWord + " " + maxNum;
}
let article = "Hello world the who,is in the hello hello Ping folkd hello";
let res = findMostWord(article);
console.log(res);

2、从字符串中查找合法的 IP 段

题目描述

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,
返回所有可能的有效 IP 地址
这些地址可以通过在 s 中插入 ‘.’ 来形成。

输入:s = ‘25525511135’
输出:[‘255.255.11.135’,‘255.255.111.35’]

有效 IP 地址正好由四个整数组成,中间使用 ‘.’ 分割,
每个整数位于 0 到 255 之间组成,不能含有前导 0
例如: ‘0.1.2.201’ 是有效的,‘0.011.255.245’ 是无效的

代码

function resolveIP(str) {
  const res = [];
  // 合法性判断
  if (str.length < 4 && str.length > 12) {
    return res;
  }
  for (let a = 1; a < 4; a++) {
    for (let b = 1; b < 4; b++) {
      for (let c = 1; c < 4; c++) {
        const d = str.length - a - b - c;
        if (d >= 1 && d <= 3) {
          const one = str.substring(0, a);
          const two = str.substring(a, a + b);
          const three = str.substring(a + b, a + b + c);
          const four = str.substring(a + b + c);
          if (isValid(one) && isValid(two) && isValid(three) && isValid(four)) {
            res.push(`${one}.${two}.${three}.${four}`);
          }
        }
      }
    }
  }
  return res;
}
//检测分割字符串合法性
function isValid(str) {
  const one = +str === 0 && str.length === 1; //等于 0 且只有一位
  const two = +str > 0 && str.charAt(0) !== "0";//大于 0 且前导不为 0
  const three = +str <= 255;

  return (one || two) && three;
}

const res1 = "25525511135";
const res2 = "11101";

console.log(resolveIP(res1));	//[ '255.255.11.135', '255.255.111.35' ]
console.log(resolveIP(res2));	//[ '1.1.10.1', '1.11.0.1', '11.1.0.1' ]

3、根据一个对象进行字符串替换解析

题目描述

实现函数使得将str字符串中的{}内的变量替换,如果属性不存在保持原样(比如{a.d})
var a = {
b: 123,
c: ‘456’,
e: ‘789’,
}
var str=a{a.b}aa{a.c}aa {a.d}aaaa;
替换结果 ‘a123aa456aa {a.d}aaaa’

代码

function fn(obj, str) {
  str = str.split("{").map((item) => {
    if (item.indexOf("}") !== -1) {
      return item.split("}");
    } else {
      return item;
    }
  });
  //把二维数组打平为一维
  str = str.flat();

  str = str.map((item) => {
    let key, value;
    if (item.indexOf(".") !== -1) {
      key = item.split(".")[1];
      value = obj[key];
      if (value == undefined) {
        return "{" + item + "}"; //obj中不存在该属性值时,要回复原样
      } else {
        return value;
      }
    } else {
      return item;
    }
  });
  str = str.join("");
  return str;
}

let a = {
  b: 123,
  c: "456",
  e: "789",
};
let str = `a{a.b}aa{a.c}aa {a.d}aaaa`;
let res = fn(a, str);
console.log(res);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值