持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
一、题目描述:
给你一个混合了数字和字母的字符串 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 <= s.length <= 500
- s 仅由小写英文字母和/或数字组成。
二、思路分析:
将字母和数字分离,字母的存入strings,数字的存入numbers;
判断如果strings的长度+1小于numbers的长度, 或是numbers的长度+1小于strings的长度,说明字母和数字的长度至少相差两个,不能形成交叉连接,直接返回“”;
找出strings和numbers最长和最短的长度,遍历,将strings和numbers交叉放入result,最终返回result的字符串表示。
三、AC 代码:
func reformat(s string) string {
numbers := make([]rune, 0)
strings := make([]rune, 0)
for _, v := range s {
if v >= 'a' && v <= 'z' {
strings = append(strings, v)
} else {
numbers = append(numbers, v)
}
}
stringsLen, numbersLen := len(strings), len(numbers)
if stringsLen < numbersLen-1 || numbersLen < stringsLen-1 {
return ""
}
result := make([]rune, 0)
maxLen, minLen := stringsLen, numbersLen
maxs, mins := strings, numbers
if numbersLen > maxLen {
maxLen, minLen = minLen, maxLen
maxs, mins = mins, maxs
}
for k, v := range maxs {
if k < maxLen {
result = append(result, v)
}
if k < minLen {
result = append(result, mins[k])
}
}
return string(result)
}