1417. 重新格式化字符串--来源:力扣(LeetCode)

题目描述:

给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。

请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。

请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。

 

示例 1:

输入:s = "a0b1c2"
输出:"0a1b2c"
解释:"0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。

示例 2:

输入:s = "leetcode"
输出:""
解释:"leetcode" 中只有字母,所以无法满足重新格式化的条件。


示例 3:

输入:s = "1229857369"
输出:""
解释:"1229857369" 中只有数字,所以无法满足重新格式化的条件。


示例 4:

输入:s = "covid2019"
输出:"c2o0v1i9d"


示例 5:

输入:s = "ab123"
输出:"1a2b3"
 

提示:

1 <= s.length <= 500
s 仅由小写英文字母和/或数字组成。

 

结果:

 

 

主要思路:

通过创建两个字节数据,得到可以操作的数据类型,先对副本中数据进行排序,并分别计算数量。

从副本中获取数据插入对应位置,数量多的一类放在偶数位

 

 代码:

class Solution {
    public String reformat(String s) {

    //创建字符数组(一个副本)
    char[] chars = new char[s.length()];
    char[] chars2 = new char[s.length()];
    s.getChars(0, s.length(), chars, 0);
    s.getChars(0, s.length(), chars2, 0);

    //计数器
    int j = 0;//字母
    int k = 0;//数字

    //对对字符数组内部进行排序
    for (int i = 0; i < s.length(); i++) {
        if (chars[i] > 96) {
            chars2[s.length() - j-1] = chars[i];
            j++;
        } else {
            chars2[k] = chars[i];
            k++;
        }
    }

    //特殊情况,直接返回""
    if (k == 0 || k == s.length()) {

        //比较坑,单个字符返回字符本身
        if (s.length() == 1) {
            return s;
        }

        return "";
    }
    System.out.println(Arrays.toString(chars2));
    System.out.println(k);
    System.out.println(j - 1);

    /**
     * 对字符进行插入chars操作
     * 根据计数器的大小判断字符的位置
     * 大的在偶数位
     */
    if (j  < k) {
        for (int i = 0; i < s.length(); i++) {
            if (i % 2 == 0) {
                chars[i] = chars2[i / 2];
            } else {
                chars[i] = chars2[s.length() - 1 - i / 2];
            }
        }
    } else {
        for (int i = 0; i < s.length(); i++) {
            if (i % 2 == 0) {
                chars[i] = chars2[s.length() - 1 - i / 2];
            } else {
                chars[i] = chars2[i / 2];

            }
        }
    }
    System.out.println(Arrays.toString(chars));

    //输出格式
    StringBuilder sb = new StringBuilder();
    for (char x : chars) {
        sb.append(x);
    }
    return new String(sb);
}
}

 

 

 

posted @ 2020-04-21 00:09  DemonQin  阅读(296)  评论(0编辑  收藏  举报