难度简单54收藏分享切换为英文接收动态反馈
给你一个混合了数字和字母的字符串 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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| public class Solution { public String reformat(String s) { int numberCnt = 0, n = s.length(); char[] chars = s.toCharArray(); StringBuilder alph = new StringBuilder(), numbers = new StringBuilder(); for (int i = 0; i < n; i++) { if (isNumber(chars[i])) { numberCnt++; numbers.append(chars[i]); } else{ alph.append(chars[i]); } } int charCnt = n-numberCnt; if (Math.abs(numberCnt - charCnt) > 1) return "";
int cnt1 = 0, cnt2 = 0; int flag = 0; if (charCnt < numberCnt) { flag=1; } char[] chars1 = alph.toString().toCharArray(); char[] chars2 = numbers.toString().toCharArray(); StringBuilder ans = new StringBuilder(); for (int i = 0; i < n; i++) { if (i%2==flag) { ans.append(chars1[cnt1]); cnt1++; } else { ans.append(chars2[cnt2]); cnt2++; } } return ans.toString(); }
public static boolean isNumber(char ch) { if (ch >= '0' && ch <= '9') return true; return false; } }
|