0482. License Key Formatting

0482. License Key Formatting #

题目 #

  • 给定许可密钥字符串 s,仅由字母、数字字符和破折号组成。字字符串由 n 个破折号分成 n+1组。
  • 给定整数 k 以重新格式化字符串,使每一组包含 k 个字符。
  • 第一组可以比 k 短,但仍必须包含至少一个字符。
  • 两组之间需要插入破折号,且应该将所有小写字母转换为大写字母。

思路 #

模拟 #

代码 #

模拟 #

class Solution {
    public String licenseKeyFormatting(String s, int k) {
        /** 遍历 s, 确定格式化后的密钥长度 */
        int numLetterOrDigits = 0;
        for (int i = 0; i < s.length(); i++) {
            if (Character.isLetterOrDigit(s.charAt(i))) numLetterOrDigits++;
        }
        
        int sz = numLetterOrDigits;
        if (sz == 0) return "";
        sz += numLetterOrDigits % k == 0 ? numLetterOrDigits / k - 1 : numLetterOrDigits / k;
        char[] ans = new char[sz];
        
        /** 双指针 */
        int ptrS = s.length() - 1, ptrANS = ans.length - 1, cnt = 0;
        while (ptrS >= 0) {
            if (cnt == k && ptrANS > -1) { ans[ptrANS--] = '-'; cnt = 0; }
            else {
                char ch = s.charAt(ptrS--);
                if (Character.isDigit(ch)) {
                    cnt++;
                    ans[ptrANS--] = ch;
                }
                else if (Character.isLetter(ch)) {
                    cnt++;
                    ans[ptrANS--] = Character.toUpperCase(ch);
                }
            }
        }
        return String.valueOf(ans);
    }
}

致谢 #

宫水三叶