j

jaryue

V1

2023/04/14阅读:12主题:默认主题

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

  1. 小写变大写
  2. 重构并分组
    将字符串去除-并用'-'分成长度为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)-10; 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


分类:

后端

标签:

后端

作者介绍

j
jaryue
V1