携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
刷题的日常
一天一题,保持脑子清爽
重新格式化字符串
来自leetcode的 1417 题,题意如下:
给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。
示例如下:
输入:s = "a0b1c2"
输出:"0a1b2c"
解释:"0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。
输入:s = "leetcode"
输出:""
解释:"leetcode" 中只有字母,所以无法满足重新格式化的条件。
理解题意
我们可以从题意中提取的条件如下:
- 题目给定一个字符串
- 字符串中只包含数字和字母
- 要求我们将字符串中的字符重新组合后返回
- 字符的规则必须是一个字母一个数字交叉
- 如果不能组合出来,则返回空串
做题思路
简单题,其实暴力解就可以解决:
- 我们可以将数字和字母分别先提取出来放到一个地方
- 如果字母和数字的数量相差大于1,则不能满足需求,返回空串即可
- 如果数量满足题意,则将数字和字母交叉放好返回
代码实现
代码实现如下:
public class Solution {
public String reformat(String s) {
Queue<Character> q1 = new LinkedList<>();
Queue<Character> q2 = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isLetter(c)) {
q1.add(c);
continue;
}
q2.add(c);
}
if (Math.abs(q1.size() - q2.size()) > 1) {
return "";
}
Queue<Character> tmp = q1;
if (q1.size() > q2.size()) {
q1 = q2;
q2 = tmp;
}
StringBuilder sb = new StringBuilder();
while (!q1.isEmpty()) {
sb.append(q2.poll());
sb.append(q1.poll());
}
if (!q2.isEmpty()) {
sb.append(q2.poll());
}
return sb.toString();
}
}