LeetCode—string练习

415.字符串相加

. - 力扣(LeetCode)

错误示范: 

遇到这种我们第一想法就是将字符串转化成整数,但这种解法无法提交通过,只能支持将小数字互相转化,遇到较长的字符串就没法通过。

class Solution {
public:string addStrings(string num1, string num2) {long long x = stoll(num1);//stoll将字符串转化成long long类型long long y = stoll(num2); long long z = x + y; return to_string(z);//将器转化成字符串类型}
};

思路: 

解法:对两个大整数模拟「竖式加法」的过程 。

我们定义两个指针 end1 和 end2 分别指向 num 1和 num 2 的末尾,即最低位,同时定义一个变量 pcur 维护当前是否有进位,然后从末尾到开头逐位相加即可。当两个数字位数不同时,这里我们在指针当前下标处于负数的时候返回 0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理!

代码参考: 

class Solution {
public:string addStrings(string num1, string num2) {string str;int pcur = 0;int end1 = num1.size()-1,end2 = num2.size()-1;while(end1 >= 0 || end2 >= 0){ // 位数不同时用0补位// 从右向左取数int val1 = end1 < 0 ? 0 : num1[end1--] - '0';int val2 = end2 < 0 ? 0 : num2[end2--] - '0';int sum = val1 + val2 + pcur;pcur = sum / 10;//进位sum %= 10;str += (sum + '0');//加上'0'才是字符串}if(pcur == 1)//最后多出的进位{str += '1';}reverse(str.begin(),str.end());//逆置return str;}
};

HJ1 字符串最后一个单词的长度

字符串最后一个单词的长度_牛客题霸_牛客网

思路: 

调用流插入cin时,流提取遇到' '空格会被自动跳过,直到遇到下一个非空白字符,遇到'\0'结束读取,所以用到 get()函数get() 函数是 istream 类的一个成员函数,用于从输入流中读取字符,get() 函数不会自动跳过任何空白字符,包括空格和制表符。

while循环提取字符串,直到输入流读取到字符串结束符 

代码:

#include <iostream>
using namespace std;int main() {string str;while(cin >> str){if(cin.get() == '\0')break;}cout << str.size() << endl;
}

125. 验证回文串

 思路:

使用双指针。初始时,左右指针分别指向 s 的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,并判断这两个指针指向的字符是否相同。当这两个指针相遇时,就说明 s 是回文串。

代码: 

class Solution {
public:bool isLetterOrNumber(char ch){return (ch >= '0' && ch <= '9')|| (ch >= 'a' && ch <= 'z')|| (ch >= 'A' && ch <= 'Z');}bool isPalindrome(string s) {int begin = 0,end = s.size() - 1;for(auto& ch : s)//加&,在原字符串上修改,现将所有大写转化成小写{if(ch >= 'A' && ch <= 'Z'){ch += 32;}}while(begin <= end){while(begin < end && !isLetterOrNumber(s[begin])){++begin;}while(begin < end && !isLetterOrNumber(s[end])){--end;}if(s[begin++] != s[end--]){return false;}}return true;}
};

541. 反转字符串 II

思路:

 我们直接按题意进行模拟:反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。

len < i + k 时,就是剩余子串不足k;

len > i + k 时,是子串个数大于k

—> 剩余字符小于 2k 但大于或等于 k 个 / 在原字符上,字符等于2k;

代码: 

class Solution {
public:string reverseStr(string s, int k) {int len = s.size();for(int i = 0; i < len ;i += 2 * k){//反转每个下标从 2k 的倍数开始的,长度为 k 的子串reverse(s.begin() + i,s.begin() + min(i + k ,len));//len < i + k 时,就是剩余子串不足k//len > i + k 时,是子串个数大于k //——> 剩余字符小于 2k 但大于或等于 k 个 / 在原字符上,字符等于2k }return s;}
};

557. 反转字符串中的单词 III

思路:

开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。

代码:

class Solution {
public:string reverseWords(string s) {string tmp;//开一个新空间int len = s.length();int i = 0;while(i < len){int start = i;//刷新单词起始位置while(i < len && s[i] != ' '){//记录一个单词的长度i++;}for(int c = i - 1; c >= start ;c--){//倒序尾插tmp.push_back(s[c]);}while(i < len && s[i] == ' '){i++;tmp.push_back(' ');}}return tmp;}
};

LLCR 192. 把字符串转换成整数 (atoi)

 思路1 (用long存储):

​ 

1. 首部空格: 删除之即可;
2. 符号位: 三种情况,即 ''+'' , ''−'' , ''无符号" ;新建一个变量 sign 保存符号位,返回前判断正负即可;
3. 非数字字符: 遇到首个非数字的字符时,应立即返回;
4. 数字字符:
(1)字符转数字: “此数字的 ASCII 码” 与 “ 0 的 ASCII 码” 相减,得到当前数字x;
(2)数字拼接: 若从左向右遍历数字,设当前位字符为 c ,当前位数字为 x ,数字结果为 res ,则数字拼接公式为:
 res = 10 * res + x

5.考虑数据是否溢出:因为res是long类型的整形,所以在每轮数字拼接后,判断 res 在此轮拼接后是否超过 2147483647 ,若超过则加上符号位直接返回

代码1: 

class Solution {
public:int myAtoi(string str) {int i = 0,sign = 1;//默认符号是+long res = 0;while(i < str.size() && str[i] == ' ')//1.丢弃无用的前导空格{++i;}//2.考虑正负数if(str[i] == '-'){sign = -1;//更新符号++i;}else if (str[i] == '+') {i ++;}if(str[i] < '0' || str[i] > '9') // 正常数字第一位不能是0,必须为1~9之间的数字,否则就是非法数字return 0;  //3.考虑数据是否溢出for(;i < str.size() ; i++){//注意这句话要放在字符转换前if(str[i] < '0' || str[i] > '9')break;res = res * 10 + (str[i] - '0');//INT_MAX = 2^32 - 1 = 2147483647//大于等于最大值直接返回最大值if(res >= INT_MAX && sign == 1){return INT_MAX;}//INT_MIN = -2^32 = -2147483648//符号是-,且大于最大值时才能直接返回最小值(不看符号,MIN比MAX大1)if(res > INT_MAX && sign == -1){return INT_MIN;}}return sign * res;}
};

思路2 (不用long):

该思路只有第5点与思路1不同,res此时是int类型的数据,要避免超出int范围,我们用低于int型数据长度一位的数据 border 判断是否超过int型数据的长度。在每轮数字拼接前,判断 res 在此轮拼接后是否超过 2147483647 / 10 ,若超过则加上符号位直接返回 INT_MAX或 INT_MIN 。

代码2:

class Solution {
public:int myAtoi(string str) {int i = 0,sign = 1;//默认符号是+while(i < str.size() && str[i] == ' ')//1.丢弃无用的前导空格{++i;}//2.考虑正负数if(str[i] == '-'){sign = -1;//更新符号++i;}else if (str[i] == '+') {i ++;}if(str[i] < '0' || str[i] > '9') // 正常数字第一位不能是0,必须为1~9之间的数字,否则就是非法数字return 0;  int res = 0;//此时res是int类型,要考虑数据溢出int border = INT_MAX/10;//用来验证数据是否超出int的范围//3.考虑数据是否溢出for(;i < str.size() ; i++){//注意这句话要放在字符转换前,//因为需要验证的位数比实际值的位数要少一位if(str[i] < '0' || str[i] > '9')break;//将超过最大值和低于最小值的情况都包括了if(res > border || res == border && str[i] - '0' > 7){//还没*10就大于INT_MAX/10 或//等于INT_MAX/10 并且 当前位数字大于7(INT_MAX最后一位数是7)return sign == 1 ? INT_MAX : INT_MIN;}res = res * 10 + (str[i] - '0');}return sign * res;}
};

43. 字符串相乘

思路:

如果 num 1和 num2 之一是 0,则直接将 0 作为结果返回即可。

如果 num 1和 num2 都不是 0,则可以通过模拟「竖式乘法」的方法计算乘积。从右往左遍历乘数,将乘数的每一位与被乘数相乘得到对应的结果,再将每次得到的结果累加。这道题中,被乘数是 num1 乘数是 num2 需要注意的是,num2 除了最低位以外,其余的每一位的运算结果都需要补0(牛逼)。

代码1:

class Solution {
public://字符串相加string addStrings(string num1, string num2) {string str;int pcur = 0;int end1 = num1.size()-1,end2 = num2.size()-1;while(end1 >= 0 || end2 >= 0){int val1 = end1 < 0 ? 0 : num1[end1--] - '0';int val2 = end2 < 0 ? 0 : num2[end2--] - '0';int sum = val1 + val2 + pcur;pcur = sum / 10;//进位sum %= 10;str += (sum + '0');}if(pcur == 1){str += '1';}reverse(str.begin(),str.end());return str;}//字符串相乘string multiply(string num1, string num2) {if(num1 == "0" || num2 == "0")//任意一个是"0"返回结果就是"0"return "0";string str1;int sign = 0;for(int i = num1.size() - 1;i >=0 ; i--){string str2;int add = 0;//对每一位的运算结果补0(除最低位外),太吊了,但有风险性for (int j = num2.size() - 1;j > i;j--){str2.push_back('0');}int val2 = num2[i] - '0';//拆分num2从右向左乘num1for(int k = num1.size()-1;k >= 0;k--){int val1 = num1[k] - '0';//获取当前位数字int mul = val1 * val2 + add;add = mul / 10;//进位mul %= 10;//余数尾插str2 += ( mul + '0');}if(add != 0)//处理剩余的余数{str2 += (add % 10 + '0');add /= 10;}//先逆置str2,再进行错位相加reverse(str2.begin(),str2.end());str1 = addStrings(str1,str2);}return str1;}
};

代码2: (封装函数)

1. 下翻转数据

2. 按位相乘

3. 将乘得的结果进行错位相加,模拟乘法的笔算过程

class Solution
{
public:void MulItem(string& tmp, string& num1, char a){int i = 0, sign = 0;int mul = 0;while (i < num1.size()){mul = (num1[i] - '0') * (a - '0') + sign;if (mul >= 10){sign = mul / 10;mul %= 10;}elsesign = 0;tmp.push_back(mul + '0');i++;}if (sign > 0)tmp.push_back(sign + '0');}//对应为相加,sign进位采用引用传递int AddItem(int a, int b, int& sign){int add = a + b + sign;if (add >= 10){sign = 1;add -= 10;}elsesign = 0;return add;}//错位相加void MoveAdd(string& result, string& tmp, int k){int i, j;i = k;j = 0;int sign = 0;while (i < result.size() && j < tmp.size()){result[i] = AddItem(result[i] - '0', tmp[j] - '0', sign) + '0';i++;j++;}while (i < result.size() && sign){result[i] = AddItem(result[i] - '0', 0, sign) + '0';i++;}while (j < tmp.size()){int v = AddItem(0, tmp[j] - '0', sign);result.push_back(v + '0');j++;}if (sign)result.push_back(sign + '0');}string multiply(string num1, string num2){//先翻转数据,方便进位处理reverse(num1.begin(), num1.end());reverse(num2.begin(), num2.end());string tmp, result;for (int i = 0; i < num2.size(); ++i){//使用num2的每一个数据乘以num1MulItem(tmp, num1, num2[i]);//将乘得的结果进行错位相加MoveAdd(result, tmp, i);tmp.clear();}while (result.size() != 1 && result.back() == '0')result.pop_back();//翻转数据,恢复数据reverse(result.begin(), result.end());return result;}
};

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

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

相关文章

基于FPGA实现SD NAND FLASH的SPI协议读写

基于FPGA实现SD NAND FLASH的SPI协议读写 在此介绍的是使用FPGA实现SD NAND FLASH的读写操作&#xff0c;以雷龙发展提供的CS创世SD NAND FLASH样品为例&#xff0c;分别讲解电路连接、读写时序与仿真和实验结果。 目录 1 FLASH背景介绍 2 样品申请 3 电路结构与接口协议 …

基于微信小程序在线订餐系统

微信小程序在线订餐系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序在线订餐系统的开发全过程。通过分析微信小程序在线订餐系统管理的不足&#xff0c;创建了一个计算机管理微信小程序在线订…

免费下载Win11 24H2专业版!附详细安装教程

今日&#xff0c;系统之家小编给大家带来2024年最新的Windows11 24H2专业版系统&#xff0c;更新后系统版本号将升至26100.1591。系统基于微软官方最新Windows 11 24H2专业版进行离线制作与优化&#xff0c;确保系统安全无毒&#xff0c;兼容性强&#xff0c;可完美支持新老机型…

解锁高效项目管理:精选软件项目管理工具与技术实战

在当今快节奏的商业环境中&#xff0c;项目管理不仅是确保任务按时完成的手段&#xff0c;更是企业战略规划与执行的核心。面对日益复杂的项目需求和不断变化的市场环境&#xff0c;传统的手工管理方式已难以满足高效协同的要求。此时&#xff0c;项目管理软件作为数字化时代的…

【数据推荐】我国省市县三级的人口受教育状况数据(分年龄\性别\户籍)

人口数据是我们在各项研究中都经常使用的数据。之前我们为大家分享过基于《2020中国人口普查分县资料》整理的全国范围的第七次人口普查人口数据&#xff0c;具体包括如下8个分表&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff1a; 表1&#xff1a;我国省市县三…

只会SQL语句,可以做什么工作?

1、SQL是什么 首先简单介绍一下SQL&#xff08;Structured Query Language&#xff09;&#xff0c;是一种可以进行数据提取、聚合、分析&#xff0c;并对数据库进行构建和修改的编程语言。 相对来说&#xff0c;SQL上手非常容易&#xff0c;因为语法结构比较固定&#xff0c…

iOS分渠道统计不再难,Xinstall帮你轻松搞定

在App推广和运营的过程中&#xff0c;iOS分渠道统计一直是一个令人头疼的问题。如何准确追踪各个渠道的推广效果&#xff1f;如何优化投放策略以提高转化率&#xff1f;这些问题困扰着无数推广者。今天&#xff0c;我们就来聊聊Xinstall这款强大的分渠道统计工具&#xff0c;看…

llama_factory Qlora微调异常 No package metadata was found for The ‘autoawq‘

importlib.metadata.PackageNotFoundError: No package metadata was found for The ‘autoawq’ distribution was not found and is required by this application. To fix: pip install autoawq 其实问题比较简单 直接安装autoawq 即可 但是对应会有版本问题&#xff1a; 查…

什么是阿凡达2.0直播模式?

要了解什么是什么是阿凡达2.0直播模式,首先要了解什么是的阿凡达直播模式。 我们知道真人直播&#xff0c;播不了几个小时&#xff0c;主播就讲累了。且真人主播的价格又贵&#xff0c;以小时计费。所以很多数字人厂商推出了数字人直播。用数字人代替真人直播。在前几年的时候…

k8s的组件以及安装

目录 概念 k8s的使用场景 k8s的特点 核心组件 master主组件 1.kube-apiserver 2.etcd 3.kube-controller-manager 控制器 4.kube-scheduler node从节点组件 1.kubelet 2.kube-proxy 3.docker 总结 k8s的核心概念 安装k8s 架构 安装步骤 实验&#xff1a;创…

RabbitMQ中间件监控指标解读

监控易是一款全面的IT监控软件&#xff0c;能够实时监控各种IT资源和应用&#xff0c;确保系统的稳定运行。在RabbitMQ中间件的监控方面&#xff0c;监控易提供了详尽的监测指标&#xff0c;帮助用户深入了解RabbitMQ集群的运行状态和性能表现。 一、集群监控&#xff08;sdds…

【复旦微FM33 MCU 外设开发指南】外设篇3——SPI

前言 本系列基于复旦微FM33系列单片机的DataSheet编写&#xff0c;旨在提供一些开发指南。 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期&#xff1a;2024/08/31 文章目录 前言GPIO配置SPI配…

深度孤立森林 Deep Isolation Forest论文翻译(上)

README 绝大部分是自己翻译自己手打的&#xff0c;少部分参考有道翻译&#xff0c;主要是想仔细再读一遍&#xff0c;顺便就打出来了。这篇论文内容比较多&#xff0c;有代码&#xff0c;原作者有github和知乎账号&#xff0c;感兴趣可以找一下。欢迎讨论和批评指正。 用于异…

如何手动添加和修改Chrome浏览器的Cookies:一个简单的指南

一、打开Chrome浏览器,输入需要增加的cookie的网址 二、按 F12打开开发者控制台&#xff0c;点击 Application 三、在Storage里面可以选择Cookie&#xff0c;再点击网址进行添加需要的cookie

【职业选择】AI工程师、机器学习工程师和深度学习工程师的职责与工作内容有什么区别?

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

I2C软件模拟时序的基本要素

目录 前言 一、关于I2C 二、正文 1.引脚的配置 2.I2C的起始和终止时序 3.发送一个字节 4.接收一个字节 5.应答信号 6.指定地址写和指定地址读 总结 前言 环境&#xff1a; 芯片&#xff1a;STM32F103C8T6 Keil&#xff1a;V5.24.2.0 本文主要参考江科大教程&#…

Centos Stream9系统安装及网络配置详解

1.镜像下载 如未拥有系统镜像文件的伙伴可通过前往下面的连接进行下载&#xff0c;下载完成后需将其刻录至U盘中。 PS&#xff1a;该U盘应为空盘&#xff0c;刻录文件会导该盘格式化&#xff0c;下载文件选择dvd1.iso完整包&#xff0c;适用于本地安装。 下载地址&#xff1…

免费申请aws一年免费服务器使用教程

由于近期要测试一个公网项目&#xff0c;对比之下&#xff0c;选择了aws服务器&#xff0c;免费使用一年。 准备&#xff1a;一个visa信用卡即可&#xff0c;需要一个外网邮箱&#xff08;我这边使用的hotmail&#xff09; 注册的步骤不再赘述&#xff0c;切记几个点&#xff0…

【精选】基于Django的智能水果销售系统设计与实现

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

重要通知! | Paraverse平行云GitHub搬家啦!

随着“平行云”更名为“Paraverse平行云”&#xff0c;我们的GitHub地址也做出了相应调整。欢迎开发者访问我们的新地址&#xff0c;继续共享我们的开源仓库与实时云渲染软件&#xff01; 更改的核心内容如下&#xff1a; pingxingyun >> ParaverseTechnology * 文档…