482. 密钥格式化『简单』

题目来源于力扣(LeetCode

一、题目

482. 密钥格式化

提示:

  • S 的长度可能很长,请按需分配大小。K 为正整数。
  • S 只包含字母数字(a-z,A-Z,0-9)以及破折号'-'
  • S 非空

二、解题思路

  1. 据题意:除了第一个分组以外,每个分组都要包含 K 个字符,则采用倒序遍历往 StringBuilder 中 append 字符的方式

  2. 遍历一个 arr 字符数组,记录下数字与字母字符的数量,便于后续的数量比较

  3. 倒序遍历 arr 数组,对于数字与字符,直接 append 到 StringBuilder 中

  4. 每 K 个字符添加后,需要 append 一个破折号字符

  5. 数字与字母出现的数量与数字字母数量一致时,说明数字与字母已经遍历完毕,结束循环

  6. 最后 StringBuilder 需要反转并调用 toUpperCase 函数,将字符串中的小写字母替换为大写字母

三、代码实现

public static String licenseKeyFormatting(String S, int K) {
    StringBuilder sb = new StringBuilder();
    char[] arr = S.toCharArray();
    int count = 0;

    // 定义变量记录字符串 S 中字母与数字字符的总数量
    int numAndLetterNum = 0;
    for (char a : arr) {
        if (a != '-') {
            numAndLetterNum ++;
        }
    }
    // 不存在数字与字符时,返回空串
    if (numAndLetterNum == 0) {
        return "";
    }
    // 定义变量 j 记录遍历 arr 数组时字母与数字字符出现的数量
    int j = 0;
    // 倒序遍历 arr 字符数组
    for (int i = arr.length - 1; i >= 0; i--) {
        if (arr[i] == '-') {
            continue;
        }
        sb.append(arr[i]);
        count ++;
        // 字母与数字遍历完后,结束循环
        if (++j == numAndLetterNum) {
            break;
        }
        // 每 K 个字符后需要加一个 "-"
        if (count == K) {
            sb.append("-");
            // 重置 count
            count = 0;
        }
    }
    // 字符串翻转且将小写字母转换成大写
    return sb.reverse().toString().toUpperCase();
}

四、执行用时

五、部分测试用例

public static void main(String[] args) {
    String S = "5F3Z-2e-9-w";
    int K = 4;  // output:"5F3Z-2E9W"

//    String S = "2-5g-3-J";
//    int K = 2;  // output:"2-5G-3J"    	
    String result = licenseKeyFormatting(S, K);
    System.out.println(result);
}
posted @ 2020-05-18 21:34  知音12138  阅读(314)  评论(0编辑  收藏  举报