刷题的日常-重新格式化字符串

118 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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();
    }
}