题目来源于力扣(LeetCode)
一、题目
题目相关标签:字符串
提示:
1 <= s.length <= 500
s
仅由小写英文字母和/或数字组成。
二、解题思路
- 按题意,字符串中只存在数字与小写字母
- 遍历字符串,统计字符串字母与数字的数量
- 创建字符串长度大小的字符数组
- 遍历字符串,对出现的字符串与数字存储到新数组的指定位置,即可得到格式化的字符串
三、代码实现
public static String reformat(String s) {
// 因为需要遍历字符串中的字符,所以将字符串转换成字符数组再进行遍历
char[] arr = s.toCharArray();
// 字母数量
int letterCount = 0;
// 数字数量
int numCount = 0;
// 字母与数字的个数统计
for (char i : arr) {
if (i >= 'a' && i <= 'z') {
letterCount ++;
} else {
numCount ++;
}
}
// 字母与数字的数量差大于 1 时,说明无法组成格式化后字符串
if (letterCount - numCount > 1 || numCount - letterCount > 1) {
return "";
}
// 新字符数组用于存储格式化后的字符
char[] res = new char[s.length()];
// 设置索引默认为 0
int letterIndex = 0;
int numIndex = 0;
// 出现次数较小的一方,索引从 1 开始,否则从 0 开始
if (letterCount == numCount) {
// 出现次数相同时,使任一项的索引为 1
numIndex = 1;
} else if (letterCount < numCount) {
letterIndex = 1;
} else {
numIndex = 1;
}
// 遍历原字符数组,进行格式化的操作
for (int i = 0; i < arr.length; i++) {
if (arr[i] >= 'a' && arr[i] <= 'z') {
res[letterIndex] = arr[i];
letterIndex += 2; // 每次加 2,隔一个字符
} else {
res[numIndex] = arr[i];
numIndex += 2; // 每次加 2,隔一个字符
}
}
return String.valueOf(res);
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
String str = "a0b1c2"; // output:"0a1b2c"
// String str = "leetcode"; // output:""
// String str = "1229857369"; // output:""
// String str = "covid2019"; // output:"c2o0v1i9d"
// String str = "ab123"; // output:"1a2b3"
String result = reformat(str);
System.out.println(result);
}