LeetCode重新格式化字符串使用JavaScript解题|前端学算法

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

有人相爱,有人夜里开车看海,我是leetcode第一题都做不出来

这个是LeetCode的第1417题,是今天的每日一题的题目

重新格式化字符串

给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。

请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。

请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。

示例 1:

输入:s = "a0b1c2"

输出:"0a1b2c"

解释:"0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。

示例 2:

扫描二维码关注公众号,回复: 14468482 查看本文章

输入:s = "leetcode"

输出:""

解释:"leetcode" 中只有字母,所以无法满足重新格式化的条件。

示例 3:

输入:s = "1229857369"

输出:""

解释:"1229857369" 中只有数字,所以无法满足重新格式化的条件。

解题思路

只有字符的数量相等或者相差一个才能使任意两个相邻字符都不相同。并且数量少的那一方必须在数量多的中间,也就是说数量多的必须要最先开始,第一个必须是数量多的

ok,重要的事情分析完了,接下来开始写具体步骤

  • 第一步:定义两个数组,一个存储字符strList,一个存储数字numList,再定义一个res用于存储格式化后的字符串
  • 第二步:遍历一遍字符串s,分别将每项存入对应的数组
  • 第三步:判断一下数字长度与字符长度差值,如果大于1,就直接返回空字符串
  • 第四步:如果小于等于1,比较一下两个数组的长度,则根据最短的数组的长度,来遍历两个数组res += numList[i] + strList[i],记住第一个字符是数字
  • 第五步:如果两个数组长度相同,直接返回res;如果不相同,因为第一个字符是数字,数字比字符长的话就插入到最后,短的话就插入到最前面
var reformat = function (s) {
    let numList = [];
    let strList = [];
    for (let i = 0; i < s.length; i++) {
        if (isNaN(s[i])) {//说明是字母
            strList.push(s[i])
        } else {
            // 是数字
            numList.push(s[i])
        }
    }
    if (Math.abs(numList.length - strList.length) > 1) return "";
    let res = "";
    let minLen = Math.min(numList.length, strList.length);
    for (let i = 0; i < minLen; i++) {
        res += numList[i] + strList[i];
    }
    if(numList.length > strList.length){
        res= res+numList[numList.length-1]
    }else if(numList.length < strList.length){
        res= strList[strList.length-1]+res
    }else{
        return res
    }
    return res;
};
复制代码

image.png

知识点

  • Math.abs(x) 函数返回指定数字 x 的绝对值。

猜你喜欢

转载自juejin.im/post/7130624201547300871