1417. 重新格式化字符串『简单』

题目来源于力扣(LeetCode

一、题目

1417. 重新格式化字符串

题目相关标签:字符串

提示:

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

二、解题思路

  1. 按题意,字符串中只存在数字与小写字母
  2. 遍历字符串,统计字符串字母与数字的数量
  3. 创建字符串长度大小的字符数组
  4. 遍历字符串,对出现的字符串与数字存储到新数组的指定位置,即可得到格式化的字符串

三、代码实现

public static String reformat(String s) {
    // 因为需要遍历字符串中的字符,所以将字符串转换成字符数组再进行遍历
    char[] arr = s.toCharArray();
    // 字母数量
    int letterCount = 0;
    // 数字数量
    int numCount = 0;
    // 字母与数字的个数统计
    for (char i : arr) {
        if (i >= 'a' && i <= 'z') {
            letterCount ++;
        } else {
            numCount ++;
        }
    }
    // 字母与数字的数量差大于 1 时,说明无法组成格式化后字符串
    if (letterCount - numCount > 1 || numCount - letterCount > 1) {
        return "";
    }
    // 新字符数组用于存储格式化后的字符
    char[] res = new char[s.length()];
    // 设置索引默认为 0
    int letterIndex = 0;
    int numIndex = 0;
    // 出现次数较小的一方,索引从 1 开始,否则从 0 开始
    if (letterCount == numCount) {
        // 出现次数相同时,使任一项的索引为 1
        numIndex = 1;
    } else if (letterCount < numCount) {
        letterIndex = 1;
    } else {
        numIndex = 1;
    }
    // 遍历原字符数组,进行格式化的操作
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] >= 'a' && arr[i] <= 'z') {
            res[letterIndex] = arr[i];
            letterIndex += 2;  // 每次加 2,隔一个字符
        } else {
            res[numIndex] = arr[i];
            numIndex += 2;  // 每次加 2,隔一个字符
        }
    }
    return String.valueOf(res);
}

四、执行用时

五、部分测试用例

public static void main(String[] args) {
    String str = "a0b1c2";  // output:"0a1b2c"
//    String str = "leetcode";  // output:""
//    String str = "1229857369";  // output:""
//    String str = "covid2019";  // output:"c2o0v1i9d"
//    String str = "ab123";  // output:"1a2b3"
    String result = reformat(str);
    System.out.println(result);
}
posted @ 2020-05-13 20:38  知音12138  阅读(177)  评论(0编辑  收藏  举报