for i inrange(len(s) - 1, -1, -1): if s[i] != "-": ans.append(s[i].upper()) cnt += 1 if cnt % k == 0: ans.append("-") if ans and ans[-1] == "-": ans.pop() return"".join(ans[::-1])
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
var licenseKeyFormatting = function(s, k) { const ans = []; let cnt = 0;
for (let i = s.length - 1; i >= 0; i--) { if (s[i] !== '-') { cnt++; ans.push(s[i].toUpperCase()); if (cnt % k === 0) { ans.push("-"); } } } if (ans.length > 0 && ans[ans.length - 1] === '-') { ans.pop(); } return ans.reverse().join(''); };
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
funclicenseKeyFormatting(s string, k int)string { ans := []byte{} for i, cnt := len(s)-1, 0; i >= 0; i-- { if s[i] != '-' { ans = append(ans, byte(unicode.ToUpper(rune(s[i])))) cnt++ if cnt%k == 0 { ans = append(ans, '-') } } } iflen(ans) > 0 && ans[len(ans)-1] == '-' { ans = ans[:len(ans)-1] } for i, n := 0, len(ans); i < n/2; i++ { ans[i], ans[n-1-i] = ans[n-1-i], ans[i] } returnstring(ans) }
复杂度分析
时间复杂度:O(N),其中 N 为字符串的长度。一共需要两次遍历,第一次遍历字符串求得目标字符串,第二次遍历需要将目标字符串进行反转。
空间复杂度:O(1) 或 O(N),其中 N 为字符串的长度。这里的空间复杂度统计的是存储返回值以外的空间。如果使用的语言可以修改字符串,那么反转前后的字符串可以存储在同一片区域,空间复杂度为 O(1);如果不可以修改,那么反转前的字符串需要额外的空间进行存储,空间复杂度为 O(N)。