2025-05-02:找出第 K 个字符Ⅰ。用go语言,Alice 和 Bob 玩一个游戏。起初,Alice 有一个字符串,内容

举报
福大大架构师每日一题 发表于 2025/05/02 09:47:13 2025/05/02
【摘要】 2025-05-02:找出第 K 个字符Ⅰ。用go语言,Alice 和 Bob 玩一个游戏。起初,Alice 有一个字符串,内容是 “a”。给定一个正整数 k。Bob 要求 Alice 不断重复操作:对当前字符串中的每个字符,都替换为该字符在字母表中的下一个字母(其中 ‘z’ 替换成 ‘a’),然后把这些新字符连接到字符串的末尾。比如,字符串 “c” 经过一次操作变成 “cd”,字符串 “z...

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。

分步骤描述过程:

  1. 初始状态:字符串初始为 “a”,长度为1。

  2. 操作过程

    • 每次操作将当前字符串中的每个字符替换为其在字母表中的下一个字符(‘z’ 变为 ‘a’),然后将这些新字符连接到原字符串的末尾。
    • 例如,第一次操作生成 “b”,字符串变为 “ab”;第二次操作生成 “bc”,字符串变为 “abbc”;第三次操作生成 “bccd”,字符串变为 “abbcbccd”。
  3. 确定操作次数

    • 字符串长度每次翻倍,经过 m 次操作后长度为 2^m。找到最小的 m 使得 2^m ≥ k
  4. 二进制分析

    • k-1(转为0-based索引)表示为二进制数。每一位的1表示该字符在对应位置的操作中被生成。
    • 例如,k=5 对应二进制 100k-1=4),最高位为1,表示该字符在第三次操作生成的块中。
  5. 计算字符值

    • 字符的最终值由初始值 ‘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)

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。