[Swift]LeetCode482. 密钥格式化 | License Key Formatting
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9799232.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
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.
给定一个密钥字符串S,只包含字母,数字以及 '-'(破折号)。N 个 '-' 将字符串分成了 N+1 组。给定一个数字 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 个字符。
提示:
- S 的长度不超过 12,000,K 为正整数
- S 只包含字母数字(a-z,A-Z,0-9)以及破折号'-'
- S 非空
1 class Solution { 2 func licenseKeyFormatting(_ S: String, _ K: Int) -> String { 3 var res:[String] = [String]() 4 for index in S.indices.reversed() 5 { 6 if S[index] != "-" 7 { 8 if res.count % (K + 1) == K 9 { 10 res.append("-") 11 } 12 res.append(String(S[index])) 13 } 14 } 15 //字符数组转字符串 16 var str:String = String(res.joined(separator: "").reversed()) 17 return str.uppercased() 18 } 19 }
132ms
1 class Solution { 2 func licenseKeyFormatting(_ S: String, _ K: Int) -> String { 3 var bufferS: String = "" 4 var result: String = "" 5 6 if(S.count == 0) { return "" } 7 8 for c in S { 9 if(String(c) != "-") { 10 bufferS += (String(c)).uppercased() 11 } 12 } 13 14 var i: Int = bufferS.count % K == 0 ? K : bufferS.count % K 15 for c in bufferS { 16 if(i == 0) { 17 result += "-" 18 i = K 19 } 20 if(i > 0) { 21 result += String(c) 22 i -= 1 23 } 24 } 25 26 return result 27 } 28 }
220ms
1 class Solution { 2 func licenseKeyFormatting(_ S: String, _ K: Int) -> String { 3 let s = S.replacingOccurrences(of: "-", with: "").uppercased() 4 let chas = [Character](s) 5 6 var res = "" 7 res.append(String(chas[..<(chas.count%K)])) 8 9 for i in stride(from: chas.count % K, to: chas.count, by: K) { 10 if !res.isEmpty { 11 res.append("-") 12 } 13 res.append(String(chas[i..<(i+K)])) 14 } 15 16 return res 17 } 18 }
368ms
1 class Solution { 2 func licenseKeyFormatting(_ S: String, _ K: Int) -> String { 3 var stringArray = S.split(separator: "-").joined(separator: "").map { String($0) } 4 5 var returnString: String = "" 6 7 while(!stringArray.isEmpty) { 8 let subArray: String = Array(stringArray.suffix(K)).reduce("", +).uppercased() 9 for _ in 0..<subArray.count { 10 stringArray.removeLast() 11 } 12 returnString = stringArray.isEmpty ? "\(subArray)" + returnString : "-\(subArray)" + returnString 13 14 } 15 16 return returnString 17 } 18 }
1052ms
1 class Solution { 2 func licenseKeyFormatting(_ S: String, _ K: Int) -> String { 3 4 var n = 0 5 for c in S { 6 if c != "-" { 7 n += 1 8 } 9 } 10 11 var num_g = n / K 12 var first = K 13 if n % K > 0 { 14 first = n % K 15 num_g += 1 16 } 17 18 var res = "" 19 var temp = "" 20 var count_g = 0 21 22 for c in S { 23 if c != "-" { 24 temp += String(c).uppercased() 25 if (count_g == 0 && temp.count == first && count_g != num_g-1) || (count_g < num_g-1 && temp.count == K) { 26 res += temp + "-" 27 temp = "" 28 count_g += 1 29 } else if (count_g == num_g-1 && temp.count == K) || (count_g == 0 && temp.count == first) { 30 res += temp 31 temp = "" 32 count_g += 1 33 } 34 } 35 } 36 37 return res 38 } 39 }