数据结构04附录01:字符串大写转小写[C++]

 

图源:文心一言

上机题目练习整理~🥝🥝

本篇作为字符串的代码补充,提供了3种(差别并不大)解法以及函数的详细解释,供小伙伴们参考~🥝🥝

前文:🌸数据结构04:串的存储结构与KMP算法_串的三种存储方式-CSDN博客

  • 第1版:在力扣新手村刷题的记录,方法一与方法二是 文心一言 老师提供的建议,方法三是力扣的官方解法~🧩🧩

编辑:梅头脑🌸

题目:709. 转换成小写字母 - 力扣(LeetCode)


📇目录

🧵转换小写字母的题目

🧩题目

🌰方法一:for循环 + 转小写函数tolower

🌰方法二:transform转换 + 转小写函数tolower

🌰方法三:for循环 + ASCII码

🔚结语


🧵转换小写字母的题目

🧩题目

给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。

示例 1:

输入:s = "Hello"
输出:"hello"

示例 2:

输入:s = "here"
输出:"here"

示例 3:

输入:s = "LOVELY"
输出:"lovely"

🌰方法一:for循环 + 转小写函数tolower

📇算法思路

  • 算法思想:使用for循环,对于字符串中的每个字母转小写~
  • 时间复杂度:O(n),其中n是数组的长度,该代码对字符串中的每个字符都进行了操作。
  • 空间复杂度:O(1),其中n是数组的长度,该代码直接在原字符串上进行操作,没有使用额外的存储空间。

 ⌨️算法代码

class Solution {
public:string toLowerCase(string s) {    // 返回类型为string的方法,名为toLowerCase。它接受一个名为s的字符串参数for (char &c : s) {           // 基于范围的for循环,用于遍历字符串s中的每一个字符。这里使用的是C++11中的范围for循环语法c = std::tolower(c);       // 对于字符串s中的每个字符c,都调用了std::tolower函数。这个函数是C++标准库中的一个函数,用于将大写字母转换为小写字母}return s;  // 返回转换后的字符串  // 返回原始字符串s}
};

 ⌨️温馨提示

可能问题:请注意,以下写法可能会导致下图的执行错误:

  • 第4行直接写为:“for (char c : s)”,而非for (char &c : s)
  • 第5行直接写为:“std::tolower(c);”,而非c = std::tolower(c);

问题所在:由于std::tolower(c);没有将结果存储回原字符c,所以实际上有些字符未被转换为小写。因此,当我们尝试返回原始字符串时,它仍然是原来的大小写形式。

        

⌨️函数解释

基于范围的for循环(Range-based for loop) 

是C++11中引入的一种新特性,它允许我们更简洁、更直观地遍历容器(如数组、字符串、向量等)中的元素。

这种循环的基本语法如下:

for (element_type value : container) {  // 循环体  
}
  • element_type 是容器中元素的类型,
  • value 是我们为每个元素定义的临时变量名,
  • container 是要遍历的容器。

 为什么使用基于范围的for循环?

  1. 简洁性:它避免了使用传统的迭代器,使代码更简洁。
  2. 直观性:对于不熟悉迭代器的开发者来说,基于范围的for循环更直观,更容易理解。
  3. 性能:在某些情况下,基于范围的for循环可能比使用迭代器更快,因为编译器可以进行更多的优化。

例子

假设我们有一个整数数组,并想打印出数组中的所有元素:

使用传统的迭代器:

#include <iostream>int main() {int arr[] = {1, 2, 3, 4, 5};for (int *it = arr; it != arr + 5; ++it) {std::cout << *it << ' ';}return 0;
}

 使用基于范围的for循环:

#include <iostream>int main() {int arr[] = {1, 2, 3, 4, 5};for (int value : arr) {std::cout << value << ' ';}return 0;
}

 基于范围的for循环不仅适用于数组,还适用于所有支持迭代器的容器,如std::vectorstd::stringstd::list等。

例如本题就是基于std::string的遍历~~

🌰方法二:transform转换 + 转小写函数tolower

📇算法思路

  • 算法思想:将循环替换为transform,也可以达到对字符串中的字符逐个操作的结果;
  • 时间复杂度:O(n),其中n是数组的长度,该代码对字符串中的每个字符都进行了操作。
  • 空间复杂度:O(1),其中n是数组的长度,该代码直接在原字符串上进行操作,没有使用额外的存储空间。

 ⌨️算法代码

class Solution {
public:string toLowerCase(string s) { std::transform(s.begin(), s.end(), s.begin(), ::tolower);  // 将所有字符转换为小写  return s;  // 返回转换后的字符串  }
};
⌨️函数解释
  1. std::transform: 这是C++标准库中的函数,用于对容器中的元素进行转换。
  2. s.begin(), s.end(): 这两个参数定义了一个范围,即从字符串s的开始到结束。这意味着我们要对字符串s中的所有字符进行操作。
  3. s.begin(): 这是输出迭代器,表示转换后的字符应该被写入的位置。因为我们要将转换后的字符覆盖原字符串,所以输出迭代器就是s.begin()
  4. ::tolower: 这是一个函数指针,指向C标准库中的tolower函数。这个函数的作用是将大写字母转换为小写字母。

⌨️知识扩展

transform

参考原文:C++ transform(STL transform)函数用法详解 (biancheng.net)

transform() 可以将函数应用到序列的元素上,并将这个函数返回的值保存到另一个序列中,它返回的迭代器指向输出序列所保存的最后一个元素的下一个位置。

  • 这个序列可以是字符串,如本题;
  • 这个序列可以是向量容器,例如以下举栗在向量中存储的数据 从 摄氏度转换到 华氏度。
    • std::vector<double> deg_C {21.0, 30.5, 0.0, 3.2, 100.0};
      std::vector<double> deg_F(deg_C.size());
      std::transform(std::begin(deg_C), std::end(deg_C), std::begin(deg_F),[](double temp){ return 32.0 + 9.0*temp/5.0; });
      //Result 69.8 86.9 32 37.76 212
    • 第1行代码创建了一个名为 deg_C 的向量,并初始化了五个浮点数;
    • 第2行代码创建了一个新的向量 deg_F,其大小与 deg_C 相同。这个新向量被初始化为空。
    • 第3行使用了 std::transform 算法来转换 deg_C 中的数据,并将结果存储在 deg_F 中。
      • std::begin(deg_C) 和 std::end(deg_C):这两个函数是定义输入序列的输入迭代器,指向 deg_C 向量的开始和结束。
      • std::begin(deg_F):是目的位置的第一个元素的输出迭代器,指向 deg_F 向量的开始。(值得注意的是,如果是rbegin,则为反向迭代器,指向容器中的最后一个元素)
      • [](double temp){ return 32.0 + 9.0*temp/5.0; }:这是一个 lambda 函数,用于将摄氏度转换为华氏度。转换公式是:F = C × 9/5 + 32。

上述代码感兴趣可以直接运行这个:

#include <iostream>
#include <vector>
#include <algorithm>  // 为了使用 std::transformint main() {std::vector<double> deg_C {21.0, 30.5, 0.0, 3.2, 100.0};std::vector<double> deg_F(deg_C.size());std::transform(std::begin(deg_C), std::end(deg_C), std::begin(deg_F), [](double temp) { return 32.0 + 9.0 * temp / 5.0; });// 打印转换结果for (const auto& temp : deg_F) {std::cout << temp << " ";}return 0;
}

用静态数组也可以,代码替换如下。文心老师温馨提醒,实际使用过程中,数组长度一般是固定的,灵活性小于容器,且不负责内存管理~

#include <iostream>int main() {double deg_C[] = {21.0, 30.5, 0.0, 3.2, 100.0};double deg_F[5];  // 注意大小固定为5for (size_t i = 0; i < 5; ++i) {deg_F[i] = 32.0 + 9.0 * deg_C[i] / 5.0;}// 打印转换结果for (size_t i = 0; i < 5; ++i) {std::cout << deg_F[i] << " ";}return 0;
}

🌰方法三:for循环 + ASCII码

📇算法思路

  • 算法思想:
    • 字符类型char用于描述文字类型数据中的单个字符。对于字符类型的数据,在计算机中存储的是他们的编码(ASCII码),实质上存储的也是整数
    • ASCII码中,小写字母a-z的码值为97-122。因此,要将大写字母A-Z转换为小写字母,只需将对应的大写字母码值加上32即可;例如,大写字母A的码值为65,转换为小写字母a的码值为97(65+32);

图源:​​​​​​​C++学习(三一七)ASCII码表_c++ascii码-CSDN博客

⌨️算法代码

class Solution {
public:string toLowerCase(string s) {for (char& ch: s) {if (ch >= 65 && ch <= 90) {    // 如果字符为大写,即ASCII码介于65-90ch |= 32;                  // 对 ch 的 ASCII码与 32 做按位或运算,替代与 32的加法运算。}}return s;}
};

作者:力扣官方题解
来源:https://leetcode.cn/problems/to-lower-case/solutions/1151839/zhuan-huan-cheng-xiao-xie-zi-mu-by-leetc-5e29/

⌨️算法解释

第6行完全可以使用 ch = ch + 32;而官方采用了按位或运算ch |= 32,这么修改的条件如下:

  • 正好[65,90] 对应的二进制表示为 [(01000001)2,(01011010)2],观察从高到低第3位恒为0;
  • 32对应的二进制为(00100000)2,观察从高到低第3位恒为1;
  • 0和1相与为1,刚好就是相加的结果,对于这道题,可以用按位或代替相加的功能;
  • 不晓得是不是业内主流做法,因为按位与比相加快很多;相反,如果不能保证被加数与加数的相应位数刚好错开,就不能这么玩了。

🔚结语

博文到此结束,写得模糊或者有误之处,欢迎小伙伴留言讨论与批评,督促博主优化内容{例如有错误、难理解、不简洁、缺功能}等,博主会顶锅前来修改~~😶‍🌫️😶‍🌫️

我是梅头脑,本片博文若有帮助,欢迎小伙伴动动可爱的小手默默给个赞支持一下,感谢点赞小伙伴对于博主的支持~~🌟🌟

同系列的博文在以下链接~~🌸🌸

数据结构_梅头脑_的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_42789937/category_12262100.html?spm=1001.2014.3001.5482

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单片机常用的电子元器件基础

参考自B站该视频 1&#xff1a;电阻 贴片电阻的读取方式 四环电阻 2&#xff1a;电容 其他的电子元器件

c语言嵌套循环

c语言嵌套循环 c语言嵌套循环 c语言嵌套循环一、c语言嵌套循环格式二、嵌套循环案例九九惩罚口诀 一、c语言嵌套循环格式 for(初始值&#xff1b;表达式&#xff1b;表达式) {for&#xff08;初始值&#xff1b;表达式&#xff1b;表达式&#xff09;{代码} }int main() {for (…

宝塔发布网站问题汇总和记录

1、添加网站站点后打不开 解决办法&#xff0c;关闭防跨站攻击2 2、laravel项目部署到linux的时候出现The stream or file "/home/www/storage/logs/laravel.log" could not be opened in append mode 给目录加权限 chmod -R 777 storage 3、Class "Redis"…

Spark与HBase的集成与数据访问

Apache Spark和Apache HBase分别是大数据处理和分布式NoSQL数据库领域的两个重要工具。在本文中&#xff0c;将深入探讨如何在Spark中集成HBase&#xff0c;并演示如何通过Spark访问和操作HBase中的数据。将提供丰富的示例代码&#xff0c;以便更好地理解这一集成过程。 Spark…

vue2使用 element表格展开功能渲染子表格

默认样式 修改后 样式2 <el-table :data"needDataFollow" border style"width: 100%"><el-table-column align"center" label"序号" type"index" width"80" /><el-table-column align"cent…

【PHP】PHP利用ffmreg获取音频、视频的详细信息

目录 一、目的 二、下载并安装ffmreg 三、PHP代码 四、运行结果 一、目的 使用PHP利用ffmreg获取音频、视频的详细信息&#xff0c;音视频总时长、码率、视频分辨率、音频编码、音频采样频率、实际播放时间、文件大小。 二、下载并安装ffmreg 1、下载地址&#xff1a;htt…

Flink实战之运行架构

本文章&#xff1a;重点是分析清楚运行架构以及并行度与slot的分配 1、JobManager和TaskManager Flink中的节点可以分为JobManager和TaskManager。 JobManager处理器也称为Master&#xff0c;用于协调分布式任务执行。他们用来调度task进行具体的任务。TaskManager处理器也称…

漫潮星域2024最新项目,程序搭建开发。

漫潮星域APP2024年首发上线&#xff0c;打造元宇宙游戏的梦想家园。它是一款由生肖机甲与星际飞船为一体的元宇宙数字潮玩应用&#xff0c;在这片浩瀚的星域中&#xff0c;玩家通过自己的建设开启探索宇宙星球之旅 漫潮星域整体游戏业务将围绕生肖机甲为主题展开&#xff0c;结…

FPGA设计时序约束十六、虚拟时钟Virtual Clock

目录 一、序言 二、Virtual Clock 2.1 设置界面 三、工程示例 3.1 工程设计 3.2 工程代码 3.3 时序报告 3.4 答疑 四、参考资料 一、序言 在时序约束中&#xff0c;存在一个特殊的时序约束&#xff0c;虚拟时钟Virtual Clock约束&#xff0c;根据名称可看出时钟不是实…

如何安装“MySQL在虚拟机ubuntu”win10系统?

1、 更新列表 sudo apt-get update 2、 安装MySQL服务器 sudo apt-get install mysql-server 3、 安装MySQL客户端 sudo apt-get install mysql-client 4、 配置MySQL sudo mysql_secure_installation 5、 测试MySQL systemctl status mysql.service MySQL数据库基本…

IntelliJ IDEA使用学习

一、安装教程 网上自行下载&#xff0c;CSDN不然过审二、使用教程 2.1 快捷键操作与设置 设置 Setting——>按键映射——>选择顺手的系统快捷键 编写代码 CtrlShift Enter&#xff0c;语句完成。 “&#xff01;”&#xff0c;否定完成&#xff0c;输入表达式时按 …

微软.NET、.NET Framework和.NET Core联系和区别

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;我小时候喜欢看小人书&#xff08;连环画&#xff09;&#xff0c;在那个没有电视、没有手机的年代&#xff0c;这是…

abap 将xstring转换成PDF展示

收到外围系统的xstring之后&#xff0c;如何在sap中将其打开呢 1.创建一个屏幕 2.绘制一个customer control 3.创建流逻辑 4.流逻辑如下&#xff1a; DATA: go_html_container TYPE REF TO cl_gui_custom_container, go_html_control TYPE REF TO cl_gui_html_viewer, lv_u…

rust跟我学三:文件时间属性获得方法

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎样获得杀毒软件的病毒库时间的。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址…

React初探:从环境搭建到Hooks应用全解析

React初探&#xff1a;从环境搭建到Hooks应用全解析 一、React介绍 1、React是什么 React是由Facebook开发的一款用于构建用户界面的JavaScript库。它主要用于构建单页面应用中的UI组件&#xff0c;通过组件化的方式让开发者能够更轻松地构建可维护且高效的用户界面。 Reac…

Git的基本使用

一、Git架构 二、Git基本使用 创建版本库 在工作空间的目录中&#xff0c;右键“Git Bash Here”打开git终端 在Git终端中输入git init指令&#xff0c;创建版本库&#xff08;就是一个.git目录&#xff09; 查看版本库状态 git status将工作空间的修改添加到暂存区 git …

【汽车销售数据】2015~2023年各厂商各车型的探索 数据分析可视化

数据处理的思路&#xff1a; 1 各表使用情况&#xff1a; 汽车分厂商每月销售表&#xff0c;该表主要分析展示top10销量的厂商销量、占比变化情况&#xff08;柱形图、饼图&#xff09;&#xff1b;中国汽车分车型每月销售量表&#xff0c;该表主要分析展示top20销量的车型销…

基于springboot+uniapp的图书馆座位预约小程序(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

MongoDB-数据库文档操作(2)

任务描述 文档数据在 MongoDB 中的查询和删除。 相关知识 本文将教你掌握&#xff1a; 查询文档命令&#xff1b;删除文档命令。 查询文档 我们先插入文档到集合 stu1 &#xff1a; document([{ name:张小华, sex:男, age:20, phone:12356986594, hobbies:[打篮球,踢足球…

【RT-DETR有效改进】轻量级视觉变换器RepViT改进特征提取网络(轻量化网络)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…