1417. 重新格式化字符串

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

一、题目描述:

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

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

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

示例 1:

输入:s = "a0b1c2"

输出:"0a1b2c"

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

示例 2:

输入:s = "leetcode"

输出:""

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

示例 3:

输入:s = "1229857369"

输出:""

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

示例 4:

输入:s = "covid2019"

输出:"c2o0v1i9d"

示例 5:

输入:s = "ab123"

输出:"1a2b3"
复制代码

二、思路分析:

理清题意

简单题,继续重拳出击

给定的字符串,里面包含数字和字母,要求间断隔开,也就是说数字和字母的数量差在1内,要么相等,要么等于1,才能满足格式化的条件

在判断通过后的字符串,也就是符合条件的字符串,需要切割成每一个元素,然后以数字和字母分成两个数组,然后再拼成格式化的字符串

思路

1、切割成数组(split),分成数字和字母分成两个数组

2、判断是否符合格式化的条件

3、遍历拼接

三、AC 代码:

/**

 * @param {string} s

 * @return {string}

 */

var reformat = function(s) {
    // 切割成数组
    const list = s.split('');
    const charList = [];
    const numList = [];
    for(let i = 0; i < s.length; i += 1) {
        // 判断是否不是number
        if (isNaN(s[i])) {
            charList.push(s[i]);
        } else {
            numList.push(s[i]);
        }
    }
    // 判断数字和字母的长度绝对值是否大于1,如果是,则返回空字符串
    if (Math.abs(charList.length - numList.length) > 1) {
        return '';
    }
    // 拼接
    let result = '';
    let minLen = Math.min(numList.length, charList.length);
    for (let i = 0; i < minLen; i++) {
        result += numList[i] + charList[i];
    }
    numList.length > charList.length ? result += numList[numList.length - 1] : null;
    numList.length < charList.length ? result = charList[charList.length - 1] + result : null;
    return result;

};

复制代码

四、总结:

时间复杂度 O(n * 2)

分类:
前端
标签: