本文最后更新于:2023年3月19日 晚上
Lt1417. 重新格式化字符串
给你一个混合了数字和字母的字符串 s
,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。
示例 1:
1 2 3
| 输入:s = "a0b1c2" 输出:"0a1b2c" 解释:"0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。
|
示例 2:
1 2 3
| 输入:s = "leetcode" 输出:"" 解释:"leetcode" 中只有字母,所以无法满足重新格式化的条件。
|
示例 3:
1 2 3
| 输入:s = "1229857369" 输出:"" 解释:"1229857369" 中只有数字,所以无法满足重新格式化的条件。
|
示例 4:
1 2
| 输入:s = "covid2019" 输出:"c2o0v1i9d"
|
示例 5:
1 2
| 输入:s = "ab123" 输出:"1a2b3"
|
提示:
1 <= s.length <= 500
s
仅由小写英文字母和/或数字组成。
思路
两个数组存数字和字符,再判断两个数组长度差是否大于 1,大于则不能格式化,返回空字符串。
如果两个数组相等,分别遍历数组,轮流加入结果字符串。
如果不等,遍历数组,先加入大的数组中的对应字符,再加入小的数组中的对应字符。遍历后再将大的最后一位加入字符串。
解答
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
var reformat = function (s) { const reg1 = /^[0-9]*$/, reg2 = /^[a-zA-Z]*$/; const num = [], arr = []; for (const char of s) { if (reg1.test(char)) num.push(char); if (reg2.test(char)) arr.push(char); } if (Math.abs(num.length - arr.length) > 1) return ""; const min = num.length < arr.length ? num : arr; const max = num.length < arr.length ? arr : num; let res = ""; for (let i = 0; i < min.length; i++) { res += max[i] + min[i]; } if (max.length > min.length) { res += max[max.length - 1]; } return res; };
|