Skip to content

Latest commit

 

History

History
169 lines (136 loc) · 4.02 KB

File metadata and controls

169 lines (136 loc) · 4.02 KB

English Version

题目描述

有一个密钥字符串 S ,只包含字母,数字以及 '-'(破折号)。其中, N 个 '-' 将字符串分成了 N+1 组。

给你一个数字 K,请你重新格式化字符串,使每个分组恰好包含 K 个字符。特别地,第一个分组包含的字符个数必须小于等于 K,但至少要包含 1 个字符。两个分组之间需要用 '-'(破折号)隔开,并且将所有的小写字母转换为大写字母。

给定非空字符串 S 和数字 K,按照上面描述的规则进行格式化。

 

示例 1:

输入:S = "5F3Z-2e-9-w", K = 4
输出:"5F3Z-2E9W"
解释:字符串 S 被分成了两个部分,每部分 4 个字符;
     注意,两个额外的破折号需要删掉。

示例 2:

输入:S = "2-5g-3-J", K = 2
输出:"2-5G-3J"
解释:字符串 S 被分成了 3 个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。

 

提示:

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

 

解法

简单模拟。

Python3

class Solution:
    def licenseKeyFormatting(self, s: str, k: int) -> str:
        s = s.replace('-', '').upper()
        res = []
        cnt = (len(s) % k) or k
        t = 0
        for i, c in enumerate(s):
            res.append(c)
            t += 1
            if t == cnt:
                t = 0
                cnt = k
                if i != len(s) - 1:
                    res.append('-')
        return ''.join(res)

Java

class Solution {
    public String licenseKeyFormatting(String s, int k) {
        s = s.replace("-", "").toUpperCase();
        StringBuilder sb = new StringBuilder();
        int t = 0;
        int cnt = s.length() % k;
        if (cnt == 0) {
            cnt = k;
        }
        for (int i = 0; i < s.length(); ++i) {
            sb.append(s.charAt(i));
            ++t;
            if (t == cnt) {
                t = 0;
                cnt = k;
                if (i != s.length() - 1) {
                    sb.append('-');
                }
            }
        }
        return sb.toString();
    }
}

C++

class Solution {
public:
    string licenseKeyFormatting(string s, int k) {
        string ss = "";
        for (char c : s)
        {
            if (c == '-') continue;
            if ('a' <= c && c <= 'z') c += 'A' - 'a';
            ss += c;
        }
        int cnt = ss.size() % k;
        if (cnt == 0) cnt = k;
        int t = 0;
        string res = "";
        for (int i = 0; i < ss.size(); ++i)
        {
            res += ss[i];
            ++t;
            if (t == cnt)
            {
                t = 0;
                cnt = k;
                if (i != ss.size() - 1) res += '-';
            }
        }
        return res;
    }
};

Go

func licenseKeyFormatting(s string, k int) string {
	s = strings.ReplaceAll(s, "-", "")
	cnt := len(s) % k
	if cnt == 0 {
		cnt = k
	}
	t := 0
	res := []byte{}
	for i, c := range s {
		res = append(res, byte(unicode.ToUpper(c)))
		t++
		if t == cnt {
			t = 0
			cnt = k
			if i != len(s)-1 {
				res = append(res, byte('-'))
			}
		}
	}
	return string(res)
}

...