leetcode482. 密钥格式化
- 题目描述
- 解题思路
- 执行结果
leetcode
题目描述
给定一个许可密钥字符串 s,仅由字母、数字字符和破折号组成。字符串由 n 个破折号分成 n + 1 组。你也会得到一个整数 k 。
我们想要重新格式化字符串 s,使每一组包含 k 个字符,除了第一组,它可以比 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.length <= 105 s 只包含字母、数字和破折号 '-'. 1 <= k <= 104
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/license-key-formatting 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
查找:\\
法1
-
小写变大写 -
重构并分组
将字符串去除-并用'-'分成长度为k的部分,
1.找出'-'并删除它
2.每隔k个位置加一个'-' 3.循环找出小写字母并换成大写字母.
-
时间复杂度(O(n)) -
空间复杂度(O(n))
执行结果
法1
func licenseKeyFormatting(s string, k int) string {
for i := 0; i < len(s); i++ {//去前置'-'
if s[i] != '-' {
s = s[i:]
break
}
}
for i, t := len(s)-1, 0; i >= 0; i-- { //重构key
if s[i] == '-' {
s = s[:i] + s[i+1:]
} else {
t++
}
if t == k {
t = 0
if i-1 >= 0 {
if s[i-1] == '-' {
i--
} else {
s = s[:i] + "-" + s[i:]
}
}
}
}
bytes := []byte(s)
for i := 0; i < len(bytes); i++ {//小写变大写
if bytes[i] >= 'a' && bytes[i] <= 'z' {
bytes[i] -= ('a' - 'A')
}
}
s = string(bytes)
return s
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 156 ms , 在所有 Go 提交中击败了 30.00% 的用户 内存消耗: 7.6 MB , 在所有 Go 提交中击败了 37.50% 的用户 通过测试用例: 38 / 38 炫耀一下:
法2
法3
本文由 mdnice 多平台发布