携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
大声告诉我今天星期几,今天肯德基大喜日子可惜要加班,没得吃 今天带来的是一道leetcode的每日一题
前言
[1417. 重新格式化字符串]【简单题】,这是一个2019年的新题,别问为什么因为他题目关键词新冠。
审题
给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。 请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。 请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。
示例 1: 输入:s = "a0b1c2" 输出:"0a1b2c" 解释:"0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。
审题得知题目对数字字母前后没有要求,那就简单的不能再简单了,初步思路就是先把字符串进行拆分,拆分成两部分,一部分都是字母,一部分都是数字,题目对顺序没有要求,对前后没有要求,只要字母+ 数字独立,数字+字母独立,不能同时组合在一起,所以我们可以拆分完两个数组后,在重新拼接,我做的方法就是使用两个数组空间去存储letterChars与numberChars,然后使用Ascll码值去区分掉数字和字母,如果他不满足这个值那将会直接返回空字符串,也就是无法转换。最下面则是边界判断,判断究竟开头用数字还是用字母,采用数字则就是1:1这样 比对即可,另一个字母开头相反。
编码
class Solution {
public String reformat(String s) {
char[] chars = s.toCharArray();
List<Character> letterChars = new ArrayList<>();
List<Character> numberChars = new ArrayList<>();
for (char singleStr : chars) {
if (singleStr >= 48 && singleStr <= 57){
numberChars.add(singleStr);
}
if (singleStr >= 97 && singleStr <= 122){
letterChars.add(singleStr);
}
}
StringBuilder sb = new StringBuilder();
boolean flag = false;
if(letterChars.size() == numberChars.size() + 1 || letterChars.size() == numberChars.size()){
for (int i = 0; i < letterChars.size(); i++) {
flag = true;
sb.append(letterChars.get(i)).append(numberChars.size() > i ? numberChars.get(i) : "");
}
}
if(numberChars.size() == letterChars.size() + 1 || letterChars.size() == numberChars.size()){
if (flag){
return sb.toString();
}
for (int i = 0; i < numberChars.size(); i++) {
sb.append(numberChars.get(i)).append(letterChars.size() > i ? letterChars.get(i) : "");
}
}
return sb.toString();
}
}