LeetCode 344: 反转字符串

embedded/2025/2/5 4:45:39/

LeetCode 344: 反转字符串 - C语言题解

这道题的目标是反转一个字符数组(字符串)。我们将通过双指针法来实现这一功能。

代码实现

#include <stdio.h>void reverseString(char* s, int sSize) {int left = 0, right = sSize - 1;  // 定义左右指针while (left < right) {  // 当左指针小于右指针时char temp = s[right];  // 临时保存右指针处的字符s[right--] = s[left];  // 将左指针处的字符放到右指针位置,并右指针向左移动s[left++] = temp;  // 将临时保存的字符放到左指针位置,并左指针向右移动}
}int main() {char s[] = "hello";  // 测试字符串int sSize = 5;  // 字符串的长度reverseString(s, sSize);  // 调用反转函数printf("Reversed string: %s\n", s);  // 输出反转后的字符串return 0;
}

代码解析

  1. 函数声明

    void reverseString(char* s, int sSize)
    

    这个函数接受两个参数:

    • s:字符数组(字符串)。
    • sSize:字符数组的长度。
  2. 初始化左右指针

    int left = 0, right = sSize - 1;
    

    我们使用两个指针leftright来标记字符串的左右端,初始时left指向字符串的第一个字符,right指向字符串的最后一个字符。

  3. 循环反转字符

    while (left < right)
    

    这个while循环会继续进行,直到left大于或等于right为止,即两指针交汇时停止。每次循环中,我们会交换leftright位置的字符。

  4. 交换字符

    char temp = s[right];  // 临时保存右指针处的字符
    s[right--] = s[left];   // 将左指针处的字符放到右指针位置,并右指针向左移动
    s[left++] = temp;       // 将临时保存的字符放到左指针位置,并左指针向右移动
    
    • 我们首先将right位置的字符保存在一个临时变量temp中。
    • 然后将left位置的字符赋给right位置,同时右指针向左移动(right--)。
    • 最后将temp中的字符赋给left位置,同时左指针向右移动(left++)。
  5. 主函数

    int main() {char s[] = "hello";int sSize = 5;reverseString(s, sSize);printf("Reversed string: %s\n", s);return 0;
    }
    

    main函数中,我们定义了一个字符数组s,并指定其长度sSize为5。然后调用reverseString函数反转字符串,最后输出反转后的结果。

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n是字符串的长度。我们只需要一次遍历来交换字符。
  • 空间复杂度 O ( 1 ) O(1) O(1),我们只使用了常数空间来保存临时字符。

http://www.ppmy.cn/embedded/159657.html

相关文章

技术架构师成长路线(2025版)

目录 通用知识 计算机原理&#xff08;1 - 2 个月&#xff09; 数据结构&#xff08;2 - 3 个月&#xff09; 网络编程&#xff08;1 - 2 个月&#xff09; 软件工程&#xff08;1 个月&#xff09; 基础知识 Java 编程语言基础&#xff08;2 - 3 个月&#xff09; JVM&…

二叉树的最大深度(遍历思想+分解思想)

Problem: 104. 二叉树的最大深度 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(实则二叉树的先序遍历) 1.欲望求出最大的深度&#xff0c;先可以记录一个变量res&#xff0c;同时记录每次当前节点所在的层数depth 2.在递的过程中&#xff0c;每次递一层&#xff0…

QT:多窗口设计(主窗口点击按钮打开子窗口)

目录 一、新建QT工程 二、添加新文件 三、mainwindow.h部分 四、mainwindow.ui部分 五、mainwindow.cpp部分 六、效果演示 七、改进与完善 子窗口设计后来发现有一个更简单的方法实现&#xff08;用QDialog实现&#xff09;&#xff1a;传送门 一、新建QT工程 新建一个…

使用IDEA社区版搭建Springboot、jsp开发环境

1&#xff0c;感觉传统的JSP可以放弃&#xff0c;直接前端JS后端就可以了 2&#xff0c;建议不要用低版本的springboot&#xff0c;版本兼容搭配太麻烦 如果仅仅是搭建springboot开发环境&#xff0c;没什么难度&#xff0c;本文主要记录以下几个问题的解决&#xff1a; 1&…

DeepSeek-R1 论文. Reinforcement Learning 通过强化学习激励大型语言模型的推理能力

论文链接&#xff1a; [2501.12948] DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 实在太长&#xff0c;自行扔到 Model 里&#xff0c;去翻译去提问吧。 工作原理&#xff1a; 主要技术&#xff0c;就是训练出一些专有用途小模型&…

c++ list的front和pop_front的概念和使用案例—第2版

在 C 标准库中&#xff0c;std::list 的 front() 和 pop_front() 是与链表头部元素密切相关的两个成员函数。以下是它们的核心概念和具体使用案例&#xff1a; 1. front() 方法 概念&#xff1a; 功能&#xff1a;返回链表中第一个元素的引用&#xff08;直接访问头部元素&am…

257. 二叉树的所有路径

二叉树的所有路径 已解答 简单 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;[“1->2->5”,“…

HTB:UnderPass[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机UDP开放端口进行脚本、服务扫描 …