
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。
m 次操作后长度为 2^m。找到最小的 m 使得 2^m ≥ k。k-1(转为0-based索引)表示为二进制数。每一位的1表示该字符在对应位置的操作中被生成。k=5 对应二进制 100(k-1=4),最高位为1,表示该字符在第三次操作生成的块中。k-1 的二进制位数,最多 log₂k 次循环。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)
}

# -*-coding:utf-8-*-
defkth_character(k: int) -> str:
k -= 1
ans = ord('a')
length = k.bit_length()
for i inrange(length - 1, -1, -1):
if k >= (1 << i):
ans += 1
k -= (1 << i)
returnchr(ans)
if __name__ == "__main__":
k = 5
result = kth_character(k)
print(result)
·