【C++初阶】string类常见题目详解(二) —— 把字符串转换成整数、反转字符串、反转字符串 II、反转字符串中的单词 III、字符串相乘

news2024/11/24 6:34:03

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:C++初阶
🎯长路漫漫浩浩,万事皆有期待

上一篇博客:C++初阶】string类常见题目详解(一)—— 仅仅反转字母、字符串中的第一个唯一字母、字符串最后一个单词的长度、验证回文串、字符串相加

文章目录

  • 题目六:把字符串转换成整数
  • 题目七:反转字符串
  • 题目八:反转字符串 II
  • 题目九:反转字符串中的单词 III
  • 题目十: 字符串相乘
  • 总结:

题目六:把字符串转换成整数

链接:把字符串转换成整数
题目描述:
 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。数值为0或者字符串不是一个合法的数值则返回0。输入的字符串包括数字字母符号,可以为空。

示例:
 输入:“+2147483647”
 输出:“2147483647”

分析:
 字符串当中可能包含数字、字母和其他符号,正数可以在前面放上正号,由此可以确定的是,一个字符串一个合法的数值,则除了其第一个字符可能是正号或负号以外,其他字符都应该是数字字符。

解题思路:
 1、先判断除第一个字符以外的字符,若是其中出现了非数字字符的字符,则该字符串非法,否则我们计算出其转换为整数后的数值。
 2、再判断第一个字符,若是正号,则当前整数的正值;若是负号,则返回当前整数的负值;若还是数字字符,则再次更新当前整数的数值并返回;若第一个字符不属于这三种情况,则说明该字符串还是非法的。

代码:

class Solution {
public:
	int StrToInt(string str) {
        if (str.size() == 0) //空字符串,返回0
			return 0;
		int start = 0; //头指针指向第一个字符
		int end = str.size() - 1; //尾指针指向最后一个字符
		int ret = 0; //字符串转换为整数后的结果
		int i = 1; //标识十进制当前位的权重(当前为个位,权重为1)
		while (start < end) //判断第一个字符之后的字符
		{
			if (str[end] < '0' || str[end] > '9') //若不是数字,则非法
			{
				return 0;
			}
			ret += i*(str[end] - '0'); //ret更新
			i *= 10; //下一位权重增大十倍
			end--; //继续判断
		}
		//判断第一个字符
		if (str[end] >= '0' && str[end] <= '9') //是数字
			return ret + i*(str[end] - '0'); //再次更新ret并返回正值
		if (str[end] == '+') //标识正数
			return ret; //返回正值
		if (str[end] == '-') //标识负数
			return -ret; //返回负值
		return 0; //第一个字符不是数字、+、-当中的一个,则还是非法
	}
};

在这里插入图片描述

题目七:反转字符串

链接:344. 反转字符串
题目描述:
 编写一个函数,其作用是将输入的字符串反转过来,你必须原地修改字符串,即使用O(1)的额外空间解决这一问题。你可以假设数组中的所有字符都是ASCII码表中的可打印字符。

示例:
 输入:[ ‘h’, ‘e’, ‘l’, ‘l’, ‘o’ ]
 输出:[ ‘o’, ‘l’, ‘l’, ‘e’, ‘h’ ]

思路:
 这是一道比较简单的题目,尤其是用C++来做,我们可以使用下标的方式交换vector容器当中的数据,也可以使用逆置函数reverse对指定迭代器区间的数据进行逆置。

代码:
1.使用下标进行交换:

class Solution {
public:
	void reverseString(vector<char>& s) {
		//使用下标进行交换
		int left = 0, right = s.size() - 1;
		while (left < right)
		{
			swap(s[left], s[right]);
			left++;
			right--;
		}
	}
};

2.使用逆置函数进行逆置:

class Solution {
public:
	void reverseString(vector<char>& s) {
		//使用逆置函数进行逆置
		reverse(s.begin(), s.end()); 
	}
};

在这里插入图片描述

题目八:反转字符串 II

链接:541. 反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 :
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”

思路:
这道题是反转字符串的进阶版,看题目可能有点难理解,我们来分析一下。

我们以如下字符串为例,假设 k = 3,如下:
在这里插入图片描述

其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。因为要找的也就是每 2 * k 区间的起点,这样写,程序会高效很多。

所以当需要固定规律一段一段去处理字符串的时候,可以在 for 循环的表达式上进行尝试。

这里反转的逻辑可以直接使用 reverse 来实现反转。

代码:

class Solution {
public:
    string reverseStr(string s, int k) {
        for (int i = 0; i < s.size(); i += (2 * k)) {
            // 1. 每隔 2k 个字符的前 k 个字符进行反转
            // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (i + k <= s.size()) {
                reverse(s.begin() + i, s.begin() + i + k);
            }
            else {
                // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
                reverse(s.begin() + i, s.end());
            }
        }
        return s;
    }
};

在这里插入图片描述

题目九:反转字符串中的单词 III

链接:557. 反转字符串中的单词 III
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:
输入:s = “Let’s take LeetCode contest”
输出:“s’teL ekat edoCteeL tsetnoc”

解题思路
此题也可以直接在原字符串上进行操作,避免额外的空间开销。

当找到一个单词的时候,我们交换字符串第一个字符与倒数第一个字符,随后交换第二个字符与倒数第二个字符……如此反复,就可以在原空间上翻转单词。

在这里插入图片描述

这样,我们就完成了对一个单词的反转,我们用个 while 循环完成对整个句子里面单词的反转,而循环结束的条件就是 i < s.length()

代码:

class Solution {
public:
    string reverseWords(string s) {
        int len = s.length();
        int i = 0;
        while (i < len) {
            int start = i;
            // 1.找到第一个单词,遇到空格就停止
            while (i < len && s[i] != ' ') {
                i++;
            }
            
            // 2.反转单词的顺序
            int left = start;
            int right = i - 1;
            while (left < right) {
                swap(s[left], s[right]);
                left++;
                right--;
            }

            // 3.此时i还是指向空格的,所以继续让i++,指向下一个单词
            while (i < len && s[i] == ' ') {
                i++;
            }
        }
        return s;
    }
};

在这里插入图片描述

题目十: 字符串相乘

43. 字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = “2”, num2 = “3”
输出: “6”

解题思路
假设 num1 = 1234,num2 = 567,则把 num1 的每一个数乘以 num2 的每一个数的结果直接写出来(不用考虑进位)

在这里插入图片描述

因为我们只是进行了单纯的数学运算,没有涉及任何字符串有关的操作,所以我们可以建立一个数组 ansArr 用来保存每一列相加的总和。

那么这个 ansArr 应该开多大空间呢?

两个数相乘的乘积最长是两个数长度之和,比如
999 ∗ 999 = 998001 ,为3+3=6位数

而两个数相乘的乘积最短是两个数长度之和再减1,比如
100 ∗ 100 = 10000 ,为3+3-1=5位数

我们默认开最长的空间。然后开辟数组把每一列的数都存起来,在实现代码的时候,应该怎么写才能把每列的数放到数组中正确的位置呢?

我们把 num1 的某一位称为第 i 位,把 num2 的某一位称为第 j 位,它们相乘的结果应该是位于数组的 i+j+1 的位置:
在这里插入图片描述
这里有一个特殊情况,比如上面的 ansArr 数组开了 7 个空间,但是第一个位置是没有值的,所以我们往 ans 里面插入数据的时候,要判断一下,假设第一个位置是 0 的话,那么就从第二个位置开始插入数据。

int index = ansArr[0] == 0 ? 1 : 0;

然后我们只需要从 ansArr 数组的最后一个位置开始,往前遍历,依次进位。

比如ansArr[6] %10= 8,此时 ansArr[6] = 8 ,然后 ,然后ansArr[5] = ansArr[5] + ansArr[6] / 10,因为ansArr[6] / 10=2,向前进 2 位,所以 ansArr[5] = 45+2=47

最后再定义一个字符串 ans,把 ansArr 的数字存进去就好了
注意:记得要把数字转换成字符

这种方法是比较优的一种,时间复杂度分析为 O ( n ∗ m ) O(n*m)O(n∗m),n 和 m 分别是 num1 和 num2 的长度。

class Solution {
public:
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") {
            return "0";
        }
        int len1 = num1.size();
        int len2 = num2.size();

        //两个数相乘的乘积最长是两个数长度之和,比如 999 * 999 = 998001
        //两个数相乘的乘积最短是两个数长度之和再减1,比如 100 * 100 = 10000
        //默认开最长
        vector<int> ansArr(len1 + len2);

        for (int i = len1 - 1; i >= 0; i--) {
            int x = num1[i] - '0'; //把num1的字符转换为数字
            for (int j = len2 - 1; j >= 0; j--) {
                int y = num2[j] - '0'; //把num2的字符转换为数字
                ansArr[i + j + 1] += x * y;
            }
        }

        //进位
        for (int i = len1 + len2 - 1; i > 0; i--) {
            ansArr[i - 1] += ansArr[i] / 10; //前一位=后一位的进位值+自己
            ansArr[i] %= 10;
        }

        //拼接(判断前导0的情况)
        //[0] [] [] []
        string ans;
        int index = ansArr[0] == 0 ? 1 : 0;
        while (index < len1 + len2) {
            ans += (ansArr[index] + '0');
            index++;
        }
        return ans;
    }
};

在这里插入图片描述

总结:

今天我们比较详细地完成了string类的其他五道常见的题目。接下来,我们将进行STL中vector类的学习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

ElasticSearch学习02——Kibana安装

ElasticSearch学习02——Windows下Kibana安装 Kibana是界面化的查询数据的工具&#xff0c;下载时尽量下载与ElasicSearch一致的版本。 1、下载对应版本的Kibana ​ 有了ElasticSearch安装的经验&#xff0c;我们发现了ES和JDK有着版本对应的关系&#xff0c;Kibana和ES共同为…

【Linux基础命令】nmtui命令使用实战

前言 linux常用命令专栏已进入尾声&#xff0c;大约90个命令是日常工作中常用的&#xff0c;在拓展一些不常用的&#xff0c;也就100左右。 是不是总结下来后&#xff0c;就感觉要学的内容没有那么多了。 当然有些专属的基础命令不在本专栏内&#xff0c;比如LVM管理命令&am…

微信读书:从Paxos到Zookeeper:分布式一致性原理与实践(阅读摘录)

微信读书&#xff1a;从Paxos到Zookeeper&#xff1a;分布式一致性原理与实践&#xff08;阅读摘录&#xff09; 阅读地址 CAP理论 CAP理论告诉我们&#xff0c;一个分布式系统不可能同时满足一致性(C&#xff1a;Consistency)、可用性(A&#xff1a;Availability)和分区容错…

Andriod 开发 SearchView默认弹出软键盘

SearchView默认弹出软键盘&#xff0c;遮挡了主界面 这很明显是SearchView是默认自动获取了焦点&#xff0c;所以上网搜了一下如何清除焦点&#xff1a; SearchView searchView getActivity().findViewById(R.id.searchViewSearchbar); searchView.clearFocus(); 然而没用&…

零拷贝原理

在实际应用中&#xff0c;如果我们需要把磁盘中的某个文件内容发送到远程服务器上&#xff0c;那么它必 须要经过几个拷贝的过程。从磁盘中读取目标文件内容拷贝到内核缓冲区&#xff0c;CPU 控制器再把内核缓冲区的数据赋值到用户空间的缓冲区中&#xff0c; 接着在应用程序中…

Arrays类概述,Lambda表达式

数组操作工具类&#xff0c;专门用于操作数组元素 2&#xff1a;常用API Lambda概述 Lambda表达式是JDK开始后的一种新语法形式作用&#xff1a;简化匿名内部类的代码写法 格式&#xff1a; 注意&#xff1a;Lambda表达式只能简化函数式接口的匿名内部类的写法形式。 什么是…

JAVA-编程基础-07-面向对象思想

Lison <dreamlison163.com>, v1.0.0, 2023.03.26 JAVA-编程基础-07-面向对象思想 文章目录 JAVA-编程基础-07-面向对象思想一、三大特性封装继承多态 二、类图泛化关系 (Generalization)实现关系 (Realization)聚合关系 (Aggregation)组合关系 (Composition)关联关系 (A…

使用vim编辑器,进行保存时报错:E382: Cannot write, ‘buftype‘ option is set

目录 一、背景 1.1使用vim 进行:wq保存时&#xff0c;报错&#xff1a;E382: Cannot write, buftype option is set 1.2 产生原因 二、解决 2.1 解决办法 2.2 还原 一、背景 1.1使用vim 进行:wq保存时&#xff0c;报错&#xff1a;E382: Cannot write, buftype option i…

【UnityDOTS 二】Entity的理解

Entity的理解 Entity作为一种对CPU的Cache友好的编码方式&#xff0c;是DOTS中重要的编码流程与思想。需要程序员由OOP的思想转为DOD的思想&#xff0c;即&#xff1a;面向数据的编码方式。 Unity的ECS&#xff1a; Entity&#xff1a;只是一个代表&#xff0c;用于快速查找数…

前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息

前端Vue基于腾讯地图Api实现的选择位置组件 返回地址名称详细地址经纬度信息&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13310 效果图如下&#xff1a; #### 使用方法 使用方法 <!-- leftTitle:左边标题 name&…

哈工大计算机网络课程网络层协议详解之:路由算法概述与链路状态路由算法

哈工大计算机网络课程网络层协议详解之&#xff1a;路由算法概述与链路状态路由算法 在前面的小节中&#xff0c;我们介绍了网络中路由器的路由与转发等功能。我们说作为网络层&#xff0c;从功能上来说&#xff0c;核心功能就是要实现路由和转发。 对于转发来说&#xff0c;实…

PyTorch开放神经网络交换(Open Neural Network Exchange)ONNX通用格式模型的熟悉

我们在深度学习中可以发现有很多不同格式的模型文件&#xff0c;比如不同的框架就有各自的文件格式&#xff1a;.model、.h5、.pb、.pkl、.pt、.pth等等&#xff0c;各自有标准就带来互通的不便&#xff0c;所以微软、Meta和亚马逊在内的合作伙伴社区一起搞一个ONNX(Open Neura…

Redis - 优惠券秒杀、库存超卖、分布式锁、Redisson

文章目录 一、优惠券秒杀1.1 全局唯一ID概述1.2 Redis实现全局唯一ID1.3 添加优惠券1.3.1 entity1.3.2 Controller1.3.3 Service层1.3.4 测试 1.4 优惠券秒杀下单1.4.1 entity1.4.2 Controller1.4.3 Service1.4.3 测试 1.5 库存超卖问题1.5.1 库存超卖原因1.5.2 介绍乐观锁1.5.…

【博学谷学习记录】超强总结,用心分享 | 架构师 Jenkins学习总结

文章目录 Jenkins介绍背景应用场景主从集群 Jenkins使用访问Jenkins获取管理员密码进入jenkins主页修改管理员密码 安装插件插件安装 全局工具配置 企业实战pipeline(重点)创建PipelinePipeline语法语法示例 Jenkins介绍 背景 ​ Jenkins&#xff0c;之前叫做Hudson&#xff…

php开发人员信息搜索查询系统 名单查询系统后台 php增删改查功能

php实现人员信息搜索的功能的方法&#xff1a;1、创建conn.php文件连接人员信息数据库&#xff1b;2、创建index.php文件&#xff1b;3、通过“ if(isset($_POST[“flag”])){…}”等语句实现人员搜索功能即可。 1、首次登录需要输入访问的密码 <?php /*** 登录 **/ $mo…

git的基础总结

写在前面&#xff1a; 前天搞了个面试&#xff0c;发现好多都是会使用&#xff0c;但是要我说&#xff0c;难得说出来&#xff0c;现在对基础进行巩固总结。其实我感觉要求背出来一样的没必要吧&#xff0c;ide基本上可视化了会用就行吧。 文章目录 介绍git的状态 使用/安装/…

php使用PhpSpreadsheet导出Excel表格详解

本文会介绍php使用PhpSpreadsheet操作Excel&#xff0c;供大家参考&#xff0c;具体内容如下&#xff1a; PhpSpreadsheet介绍 1、简介 PhpSpreadsheet 是一个用纯PHP编写的库&#xff0c;提供了一组类&#xff0c;使您可以读取和写入不同的电子表格文件格式 PhpSpreadsheet …

Jetson查CPU/GPU等的占用情况——jtop的安装和使用

Jtop的安装 (1) 安装JTOP查看可查CPU等的占用情况 sudo apt-get updatesudo apt-get full-upgradesudo apt install curlsudo apt install nanocurl https://bootstrap.pypa.io/get-pip.py -o get-pip.py #下载安装脚本sudo python3 get-pip.py # 运行安装脚本sudo pip3 insta…

0401锁详解-MySQL-数据库

1 概述 介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的问题&#x…

解决QtCreator安卓平台原生C++代码无法输出日志问题

1.需求,因原生C++调用std::cout ,std::cerr,及C函数prinf输出要显示在控制台, 问题: 在QtCreator中只看到qDebug输的日志,并没有看到 cout,cerr,printf的输出日志 2.最终已解决如下 在QtCreator中显示了C++原生日志 在Android Studio 的Logcat中显示了C++原生日志 模拟器 …