当前位置: 首页 > news >正文

代码随想录刷题-字符串-反转字符串

文章目录

    • 反转字符串
      • 习题
      • 双指针
      • swap 的两种方式

反转字符串

本节对应代码随想录中:代码随想录,讲解视频:字符串基础操作! | LeetCode:344.反转字符串_哔哩哔哩_bilibili

习题

题目链接:344. 反转字符串 - 力扣(LeetCode)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:
输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

双指针

作为数组的第一题,这题还是比较简单的。反转字符串其实就是原来第一个字符变成最后一个字符,原来第二个字符变成倒数第二个字符,以此类推。那其实就是将第一个与最后一个字符交换,将第二个与倒数第二个字符交换,以此类推。并且我们只需要遍历字符串一半的长度就行交换即可。

class Solution {public:void reverseString(vector<char>& s) {int size = s.size();for (int i = 0, j = size - 1; i < size / 2; i++, j--) {swap(s[i], s[j]);}}
};
  • 时间复杂度:O(nnn)。有一个 for 循环,它的迭代次数是数组大小的一半,即 O(n/2),swap 函数交换了两个元素的值,其时间复杂度为 O(1)。因此,这个函数的时间复杂度为 O(n/2 * 1),也就是 O(n)
  • 空间复杂度:O(111)。只使用了常量级别的额外空间存储变量 i、j 和 size,因此空间复杂度为 O(1)

对于本题,其实使用库函数 reverse 就能解题,但显然本题并不是考察库函数的使用,面试的时候更不会如此。但是必须要了解可以使用什么库函数来实现,代码如下:

class Solution {public:void reverseString(vector<char>& s) {reverse(s.begin(),s.end());}
};
  • 时间复杂度:O(nnn)。只调用了一次 C++ 标准库中的 reverse 函数,其时间复杂度为 O(n),其中 n 是数组的大小
  • 空间复杂度:O(111)。没有使用任何额外的内存来存储变量,所以空间复杂度是 O(1)

swap 的两种方式

第一种是比较常见的方式

int tmp = s[i];
s[i] = s[j];
s[j] = tmp;

第二种是通过位运算

int a = 5; // 101
int b = 7; // 111
a ^= b; // 此时 a 的值为 2(101^111=010)
b ^= a; // 此时 b 的值为 5(010^111即(101^111)^111=101)
a ^= b; // 此时 a 的值为 7(010^101即(101^111)^101=111)

解释:利用异或运算符的特性(一个数异或同一个数两次会得到原始的值),这个交换操作不需要临时变量,比第一种方法更快,尤其是在处理大型数据集时。但要注意的是,这种方式只适用于整型数据类型,对于其他类型,例如浮点数、字符或自定义对象等,则需要采用其他方法进行交换。

解题的时候一般的交换元素可以直接用 swap 函数即 swap(a,b)

http://www.lryc.cn/news/44378.html

相关文章:

  • 14-链表练习-剑指 Offer II 021. 删除链表的倒数第 n 个结点
  • 用Java解决华为OD机试考题,真的高效,真的强,来吧,清单奉上,祝你上岸
  • 【Stable Diffusion】Stable Diffusion免安装在线部署教程
  • Jetson设备如何接调试串口工具查看内核打印信息
  • 一直被低估的美图,正悄悄成为AIGC领跑者
  • JAVA开发与运维(JavaWeb测试环境搭建)
  • python 的range函数你需要知道三件事
  • 穿越周期的进击,科沃斯“敢”于变革
  • 不使用IF语句对一组数进行排序的分析和实现
  • 在大厂做了5年测试,3月被无情辞退,想给摸鱼的兄弟提个醒
  • 【职业规划】第二篇:程序员分级之中级程序员
  • Studio One没有声音怎么办 Studio One工程没有声音
  • x86架构利用docker去编译arm64的应用程序
  • 华为OD机试题 - 优秀学员统计(JavaScript)| 机考必刷
  • Nginx学习(7)—— 过滤模块(filter)
  • 【创作赢红包】
  • Mybatis入门
  • 金色传说:SAP-PP-CO01/CO02 生产订单下达保存时报错:用户状态 新建 是活动的 (ORD %00000000001) 消息号BS014
  • @Transactional和synchronized同时使用时的一些问题以及解决
  • 贪心-根据身高重建队列
  • 「解析」牛客网-华为机考企业真题 21-40
  • JAVA练习92-快乐数
  • BPF 之路:技术背景
  • C++—— set、map、multiset、multimap
  • Qlib使用
  • TL-WDR7660 httpProcDataSrv任意代码执行漏洞复现分析
  • 基于DDS的SOA测试方案实现
  • LibTorch中Windows系统环境配置及CUDA不可用问题解决
  • Java并发编程实战二
  • Linux中最基本的命令ls的用法有哪些?