重新格式化字符串

166 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 <= 500
  • s 仅由小写英文字母和/或数字组成。

思路分析

根据题意可知,给出资格字符串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);