携手创作,共同成长!这是我参与「掘金日新计划 · 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)