美文网首页
482. License Key Formatting

482. License Key Formatting

作者: Jeanz | 来源:发表于2017-12-26 13:37 被阅读0次

    You are given a license key represented as a string S which consists only alphanumeric character and dashes. The string is separated into N+1 groups by N dashes.

    Given a number K, we would want to reformat the strings such that each group contains exactly K characters, except for the first group which could be shorter than K, but still must contain at least one character. Furthermore, there must be a dash inserted between two groups and all lowercase letters should be converted to uppercase.

    Given a non-empty string S and a number K, format the string according to the rules described above.

    Example 1:

    Input: S = "5F3Z-2e-9-w", K = 4
    
    Output: "5F3Z-2E9W"
    

    Explanation: The string S has been split into two parts, each part has 4 characters.
    Note that the two extra dashes are not needed and can be removed.
    Example 2:

    Input: S = "2-5g-3-J", K = 2
    
    Output: "2-5G-3J"
    

    Explanation: The string S has been split into three parts, each part has 2 characters except the first part as it could be shorter as mentioned above.
    Note:
    The length of string S will not exceed 12,000, and K is a positive integer.
    String S consists only of alphanumerical characters (a-z and/or A-Z and/or 0-9) and dashes(-).
    String S is non-empty.

    一刷
    题解:
    StringBuilder insert

    class Solution {
        public String licenseKeyFormatting(String S, int K) {
            StringBuilder sb = new StringBuilder();
            for(char c : S.toCharArray()){
                if(c=='-')  continue;
                if(c>='a' && c<='z')    c = Character.toUpperCase(c);
                sb.append(c);
            }
            int insertIndex = sb.length() - K;
            while(insertIndex>0){
                sb.insert(insertIndex,'-');
                insertIndex = insertIndex - K;
            }
            return sb.toString();
        }
    }
    

    二刷
    由于StringBuilder的insert操作时间复杂度为O(n), 所以采用从头到尾append的方式

    class Solution {
        public String licenseKeyFormatting(String s, int k) {
            StringBuilder sb = new StringBuilder();
            char[] cs = s.toCharArray();
            for(char c :cs){
                if(c == '-') continue;
                if(c>='a' && c<='z') c = Character.toUpperCase(c);
                sb.append(c);
            }
            if(sb.length()==0) return "";
            int numDash = sb.length()/k;
            int remain = sb.length() - k*numDash;
            int newLen = sb.length() + numDash;
            StringBuilder res = new StringBuilder();
            int i=0;
            if(remain == 0){
                i = k;
                res.append(sb.substring(0,k));
            }else{
                i = remain;
                res.append(sb.substring(0,remain));
            }
            for(;i<sb.length(); i+=k){
                res.append("-");
                if(i+k<cs.length) res.append(sb.substring(i,i+k));
                else res.append(sb.substring(i));
            }
            
           return res.toString();
        }
    }
    

    相关文章

      网友评论

          本文标题:482. License Key Formatting

          本文链接:https://www.haomeiwen.com/subject/stgdgxtx.html