2025-05-02:找出第 K 个字符Ⅰ。用go语言,Alice 和 Bob 玩一个游戏。起初,Alice 有一个字符串,内容是 “a“。 给定一个正整数 k。 Bob 要求 Alice 不断重复操

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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

福大大架构师每日一题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值