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.
本题题目大意是这样,给定一个字符串,要求变成"k-K-K"形式,只有第一个块可以少点,那就容易了,从后往前遍历,最终在转置下,就可以得到了。
为了减少末尾多加一个‘-’的可能性,可以采取判断满足count在前面的策略。
func licenseKeyFormatting(S string, K int) string {
var ret []byte
var count int
for i := len(S) - 1; i >= 0; i-- {
if S[i] == '-' {
continue
}
if count == K { // 有了值才判断是否添加,优于插入了字符后判断要不要加‘-’,这样可以避免末尾多加一个‘-’
count = 0
ret = append(ret, byte('-'))
}
count++
c := S[i]
if c >= 'a' && c <= 'z' {
c -= 32
}
ret = append(ret, byte(c))
}
if len(ret) > 1 {
for i, j := 0, len(ret)-1; i < j; i, j = i+1, j-1 {
ret[i], ret[j] = ret[j], ret[i]
}
}
return string(ret)
}