2025-05-02:找出第 K 个字符Ⅰ。用go语言,Alice 和 Bob 玩一个游戏。起初,Alice 有一个字符串,内容是 “a”。
给定一个正整数 k。
Bob 要求 Alice 不断重复操作:对当前字符串中的每个字符,都替换为该字符在字母表中的下一个字母(其中 ‘z’ 替换成 ‘a’),然后把这些新字符连接到字符串的末尾。
比如,字符串 “c” 经过一次操作变成 “cd”,字符串 “zb” 经过一次操作变成 “zbac”。
不断执行该操作,直到字符串长度不少于 k,然后返回字符串中的第 k 个字符。
1 <= k <= 500。
输入:k = 5。
输出:“b”。
解释:
最初,word = “a”。需要进行三次操作:
生成的字符串是 “b”,word 变为 “ab”。
生成的字符串是 “bc”,word 变为 “abbc”。
生成的字符串是 “bccd”,word 变为 “abbcbccd”。
题目来自leetcode3304。
分步骤描述过程:
-
初始状态:字符串初始为 “a”,长度为1。
-
操作过程:
- 每次操作将当前字符串中的每个字符替换为其在字母表中的下一个字符(‘z’ 变为 ‘a’),然后将这些新字符连接到原字符串的末尾。
- 例如,第一次操作生成 “b”,字符串变为 “ab”;第二次操作生成 “bc”,字符串变为 “abbc”;第三次操作生成 “bccd”,字符串变为 “abbcbccd”。
-
确定操作次数:
- 字符串长度每次翻倍,经过
m
次操作后长度为2^m
。找到最小的m
使得2^m ≥ k
。
- 字符串长度每次翻倍,经过
-
二进制分析:
- 将
k-1
(转为0-based索引)表示为二进制数。每一位的1表示该字符在对应位置的操作中被生成。 - 例如,
k=5
对应二进制100
(k-1=4
),最高位为1,表示该字符在第三次操作生成的块中。
- 将
-
计算字符值:
- 字符的最终值由初始值 ‘a’ 加上二进制中1的个数。每个1对应一次操作,每次操作字符值递增。
时间复杂度和空间复杂度:
- 时间复杂度:O(log k),需要遍历
k-1
的二进制位数,最多 log₂k 次循环。 - 额外空间复杂度:O(1),仅使用常数空间存储中间变量。
Go完整代码如下:
package main
import (
"fmt"
"math/bits"
)
func kthCharacter(k int) byte {
k--
ans := byte('a')
for i := bits.Len(uint(k)) - 1; i >= 0; i-- {
if k >= 1<<i { // k 在右半边
ans++
k -= 1 << i
}
}
return ans
}
func main() {
k := 5
result := kthCharacter(k)
fmt.Printf("%c\r\n", result)
}
Python完整代码如下:
# -*-coding:utf-8-*-
def kth_character(k: int) -> str:
k -= 1
ans = ord('a')
length = k.bit_length()
for i in range(length - 1, -1, -1):
if k >= (1 << i):
ans += 1
k -= (1 << i)
return chr(ans)
if __name__ == "__main__":
k = 5
result = kth_character(k)
print(result)