2026-05-08:反转字符串前缀。用go语言,给定字符串 s 和整数 k,把 s 的开头 k 个字符顺序完全倒过来(其余字符保持原样),输出新的字

🤖 AI总结

主题

用Go/Python/C++实现反转字符串前缀的算法题解

摘要

文章详细讲解了反转字符串前缀的算法,给出Go、Python、C++三种语言的实现,并分析了时间与空间复杂度。

关键信息

  • 1 反转字符串前k个字符,其余不变
  • 2 Go中需转字节切片,双指针交换
  • 3 时间复杂度O(k),空间复杂度O(n)

2026-05-08:反转字符串前缀。用go语言,给定字符串 s 和整数 k,把 s 的开头 k 个字符顺序完全倒过来(其余字符保持原样),输出新的字符串。

1 <= s.length <= 100。

s 仅由小写英文字母组成。

1 <= k <= s.length。

输入: s = “abcd”, k = 2。

输出: “bacd”。

解释:

前 k = 2 个字符 “ab” 反转为 “ba”。最终得到的结果字符串为 “bacd”。

题目来自力扣3794。

执行过程详细描述 步骤1:接收输入参数

程序接收到两个关键输入:

• 待处理的原始字符串:abcd(由4个小写英文字母组成)

  • • 需要反转的前缀长度:2(表示只反转字符串最开头的2个字符)

    步骤2:字符串转换为可修改的字节切片

    Go语言中的字符串是不可变类型,无法直接修改字符顺序,因此需要将字符串转换为字节切片

    • 原始字符串abcd转换后得到字节切片:['a', 'b', 'c', 'd']

  • • 转换的目的:只有字节切片支持直接交换元素位置,才能实现字符反转

    步骤3:校验并确定反转的边界

    1. 计算字节切片的总长度:长度为4

  • 2. 校验输入的k值:题目规定1<=k<=字符串长度,这里k=2小于4,无需调整

  • 3. 确定反转区间:需要反转索引0到索引1的字符(前k个字符,索引从0开始计数,结束位置为k-1)

    步骤4:双指针法反转指定区间的字符

    使用左指针右指针相向移动,交换指针指向的字符,直到两指针相遇:

    1. 初始化指针:左指针l指向起始位置0(字符a),右指针r指向结束位置1(字符b

  • 2. 第一次交换:交换l=0r=1的字符,字节切片变为['b', 'a', 'c', 'd']

  • 3. 指针移动:左指针l加1变为1,右指针r减1变为0

  • 4. 终止判断:此时l >= r,反转操作结束,无需继续交换

    步骤5:保留剩余字符的原始顺序

    反转完成后,索引2、3位置的字符cd全程没有被修改,保持原始顺序不变。
    最终的字节切片为:['b', 'a', 'c', 'd']

    步骤6:字节切片转换回字符串

    将处理完成的字节切片重新转换为Go语言字符串格式,得到最终结果:bacd

    步骤7:输出结果

    程序将最终的字符串bacd打印输出,完成整个处理流程。

    时间复杂度与额外空间复杂度分析 1. 时间复杂度

    时间复杂度为O(k)(k是需要反转的前缀长度):

    • 核心操作是双指针交换字符,只需要遍历前k个字符,交换次数为k/2次;

  • • 剩余的字符无需任何操作,整体执行次数和k成正比,与字符串总长度n无关。

  • • 简化表示:也可写为O(n)(n为字符串总长度),因为k≤n,是等价的复杂度量级。

    2. 额外空间复杂度

    额外空间复杂度为O(n)(n为字符串总长度):

    • 程序额外创建了一个和原字符串长度相同的字节切片,用于存储和修改字符;

  • • 除了这个字节切片外,只使用了常数个指针变量(l、r、n等),没有占用其他额外空间;

  • • 额外空间大小与输入字符串的长度成正比。

    总结

    1. 执行核心:转字节切片→双指针反转前k个字符→转回字符串,剩余字符保持不变;

  • 2. 时间复杂度:O(k)(最优情况,仅遍历需要反转的部分);

  • 3. 额外空间复杂度:O(n)(因字符串不可变,必须开辟新切片存储)。

    Go完整代码如下:

    package main

    import (
    "fmt"
    )

    func reversePrefix(s string, k int)string {
    // 将字符串转换为字节切片以便交换
    bytes := []byte(s)
    n := len(bytes)
    // 确保 k 不超过字符串长度
    if k > n {
    k = n
    }
    // 反转从 0 到 k-1 的字符
    for l, r := 0, k-1; l < r; l, r = l+1, r-1 {
    bytes[l], bytes[r] = bytes[r], bytes[l]
    }
    returnstring(bytes)
    }

    func main() {
    s := "abcd"
    k := 2
    result := reversePrefix(s, k)
    fmt.Println(result)
    }

    2026-05-08:反转字符串前缀。用go语言,给定字符串 s 和整数 k,把 s 的开头 k 个字符顺序完全倒过来(其余字符保持原样),输出新的字

    Python完整代码如下:

    # -*-coding:utf-8-*-

    def reversePrefix(s: str, k: int) -> str:
    # 将字符串转换为列表以便交换
    chars = list(s)
    n = len(chars)
    # 确保 k 不超过字符串长度
    if k > n:
    k = n
    # 反转从 0 到 k-1 的字符
    left, right = 0, k - 1
    while left < right:
    chars[left], chars[right] = chars[right], chars[left]
    left += 1
    right -= 1
    return''.join(chars)

    if __name__ == "__main__":
    s = "abcd"
    k = 2
    result = reversePrefix(s, k)
    print(result)

    2026-05-08:反转字符串前缀。用go语言,给定字符串 s 和整数 k,把 s 的开头 k 个字符顺序完全倒过来(其余字符保持原样),输出新的字

    C++完整代码如下:

      
    


    using namespace std;

    string reversePrefix(string s, int k) {
    // 确保 k 不超过字符串长度
    int n = s.length();
    if (k > n) {
    k = n;
    }
    // 反转从 0 到 k-1 的字符
    for (int l = 0, r = k - 1; l < r; l++, r--) {
    swap(s[l], s[r]);
    }
    return s;
    }

    int main() {
    string s = "abcd";
    int k = 2;
    string result = reversePrefix(s, k);
    cout << result << endl;
    return0;
    }

    2026-05-08:反转字符串前缀。用go语言,给定字符串 s 和整数 k,把 s 的开头 k 个字符顺序完全倒过来(其余字符保持原样),输出新的字

    我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

    © 版权声明

    相关文章