持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情。
题目描述
给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串。
来源:力扣(LeetCode)
- 示例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 <= s.length <= 500s仅由小写英文字母和/或数字组成。
思路分析
根据题意可知,给出资格字符串s,字符串s是由小写字母和数字组成,然后对其进行格式化,什么是格式化字符串呢,就是将字符串里面两两相隔的字类型要不一样,比如说第一个是数字第二个就是小写字母第三个要是数字,第一个如果是字母也是同样的规则。
若要可以格式化,字母和数字的数量就只有三种可能:
1.字母的数量比数字的数量要多一个;
2.数字的数量比字母的数量多一个;
3.字母的数量和数字的数量一样多;
具体的做法就是将数字和字母分离出来,各放到一个数组里面,取个长度较长的数组来循环,然后将两个数组的每个元素一个一个拼接起来。
AC代码
let s = 'a0b1c2'
function solution( s ) {
let arr = s.split('');
let newArr = [], res = '';
for(let i=0; i<arr.length; i++) {
if(arr[i].charCodeAt() >= 97 && arr[i].charCodeAt() <= 122) {
newArr.push(arr.splice(i, 1)[0]);
i--
}
}
if(Math.abs(arr.length - newArr.length) > 1) {
return "";
}else{
if(arr.length >= newArr.length) {
newArr.push('');
for(let i=0; i<arr.length; i++) {
res+=arr[i] + newArr[i]
}
}else{
arr.push('');
for(let i=0; i<newArr.length; i++) {
res+=arr[i] + newArr[i]
}
}
}
console.log(res);
}
solution(s);