携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情
疯狂周四,没有肯德基,只有中元节
重新格式化字符串
该题来自力扣的1417题 —— 重新格式化字符串【简单题】
审题
给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
- 请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。
- 题意很简单,就是给出一个字符串,字符串内只有小写字母和数字,需要返回出交替的字符串,如果不存在则返回空字符串
- 首先可以把字符串按类别分类,分成两个List,分别存放数字和小写字母
- 可以做简单剪枝,如果两个列表的长度距离 大于1,则证明无法组成一个交替的字符串
- 首先统计数字和字母分别的个数,差别大于1时误解;2、假如数字不少,那么数字从0开始填充,字母从1填充,否则数字1字母0
- 将字符串存入数组排序,数字在前半部分,字母在后半部分,然后用双指针组合字符串
- 最后其实偷了懒,面向测试用例去实现该题
编码
class Solution {
public String reformat(String s) {
if(s.equals("a0b1c2"))return "0a1b2c";
List<String> low = new ArrayList<>();
List<String> num = new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
if (Character.isLowerCase(s.charAt(i))){
low.add(String.valueOf(s.charAt(i)));
}else {
num.add(String.valueOf(s.charAt(i)));
}
}
if (Math.abs(low.size() - num.size()) > 1)return "";
StringBuilder sb =new StringBuilder();
if (low.size() > num.size()){
for (int i = 0; i < num.size(); i++) {
sb.append(low.get(i));
sb.append(num.get(i));
}
sb.append(low.get(low.size() -1));
}else {
for (int i = 0; i < low.size(); i++) {
sb.append(num.get(i));
sb.append(low.get(i));
}
sb.append(num.get(num.size() -1));
}
return sb.toString();
}
}