【string题解 C++】字符串相乘 | 翻转字符串III:翻转单词
字符串相乘
题面
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = "2", num2 = "3" 输出: "6" 示例 2:
输入: num1 = "123", num2 = "456" 输出: "56088"
错误记录
我一开始的思路是:先把俩字符串转化成整数,然后相乘,结果再转化成字符串返回回去。然后挣扎了很久,每次测试都没问题,一提交就报错。后来我仔细看了下题面,发现人家早就说明了:“不能使用任何内置的 BigInteger 库或直接将输入转换为整数。”
所以这道题要的就是你去模拟乘法的计算过程,并且计算过程的数字要以字符的形式存进string中。
Way1 拆分成“先乘后加”
思路

现在目的明确,完成两个Part:
1.遍历两个字符串,将整个的乘法拆分成一部分一部分的乘积。
2.将这些乘积相加,即写一个字符串相加的函数。
实现
class Solution {
public:string multiply(string num1, string num2) {if(num1=="0"||num2=="0"){ //如果有一个被乘数是0,那结果直接返回0return "0";}int n1=num1.size(),n2=num2.size(); string ret,combine_ret;for(int i=n1-1;i>=0;i--){ //每次都要把上一次的更新一下ret.clear();int add_num=0; //用于保存进位for(int j=n2-1;j>=0;j--){int tmp=(num1[i]-'0')*(num2[j]-'0')+add_num;int present_num=tmp%10; //当前位ret.insert(ret.begin(),present_num+'0');add_num=tmp/10;}if(add_num){ //如果还有剩余的add_num,别忘了进位 ret.insert(ret.begin(),add_num+'0');}int add_num_of_zero=n1-1-i; //补0while(add_num_of_zero){ret.push_back('0');add_num_of_zero--;}combine_ret=addString(combine_ret,ret);}return combine_ret;}string addString(string s1,string s2){ //这里字符串相加 采用的是补0的思路,很实用int n1=s1.size(),n2=s2.size();string StrRet;//通过在前面补0的方法,让n1和n2位数对齐while(n1>n2){s2.insert(s2.begin(),'0');n2++;}while(n2>n1){s1.insert(s1.begin(),'0');n1++;}
int add_num=0;for(int i=n1-1;i>=0;i--){int tmp=(s1[i]-'0')+(s2[i]-'0')+add_num;add_num=tmp/10;StrRet.insert(StrRet.begin(),tmp%10+'0');}if(add_num){ //如果还有剩余的add_num,别忘了进位StrRet.insert(StrRet.begin(),add_num+'0');}return StrRet;}
};
时空复杂度分析
时间复杂度为O(n1*n2),其中n1、n2分别是num1、num2的长度。
空间复杂度O(1)
反思
1.每次循环开始前 ,别忘了刷新变量!要再设回初始值。

2.字符串相加,用补0的思路,很好用。先将俩字符串的位数 用0补得整齐,后面就很好计算了。
3.最常犯的错误是:没把数字转化成askii码存进字符串
for(int i=n1-1;i>=0;i--){int tmp=AddNum+(s1[i]-'0')+(s2[i]-'0');ret.insert(ret.begin(),tmp%10); //应为tmp%10+'0'AddNum=tmp/10;}
4.这个思路的亮点在于 拆分成先乘后加 和 补0。
Way2 用数组
思路

1.开大小为n1+n2的数组(记得初始化为0)。
因为两数相乘,乘积的位数 是不会超过 被乘数的位数之和的,所以这个大小一定够用了。
2.从右往左遍历被乘数的每个位数,结果挨个放进数组里。
3.把数组的数存进字符串,同时要考虑进位。
实现
class Solution {
public:string multiply(string num1, string num2) {if(num1=="0"||num2=="0"){return "0";}int n1=num1.size(),n2=num2.size();int NumArr=n1+n2;int*arr=new int[NumArr](); //注意这种写法 可以初始化为0
int k=NumArr-1;for(int i=n1-1;i>=0;i--){int CopyK=k; for(int j=n2-1;j>=0;j--){int tmp=(num1[i]-'0')*(num2[j]-'0');arr[k--]+=tmp;}k=CopyK-1;}
//把数组内容存进字符串string ret;int AddNum=0;for(int i=NumArr-1;i>=0;i--){//进位AddNum=arr[i]/10;if(i>0){arr[i-1]+=AddNum; //这里要小心,i-1是很容易越界的!所以要加个条件判断 }
ret.insert(ret.begin(),arr[i]%10+'0');}if(AddNum){ret.insert(ret.begin(),AddNum+'0');}delete[] arr;for(int i=0;i<NumArr;i++){if(ret[i]!='0'){return ret.substr(i);}}return ret;}
};
时空复杂度分析
时间复杂度为O(n1*n2+n1+n2),n1、n2分别为num1、num2的大小
空间复杂度为O(n1+n2)
翻转字符串III:翻转字符串中的单词
题面
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = "Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc" 示例 2:
输入: s = "God Ding" 输出:"doG gniD"
错误记录
第一次写的时候,报执行出错,修改了好久,也没发现错误:
class Solution {
public:void swap(string& s,int left,int right){while(left!=right){std::swap(s[left],s[right]);left++;right--;}}string reverseWords(string s) {int num=s.size();int front_i=0;for(int i=0;i<num;i++){if(s[i]==' '){if(front_i!=0){front_i+=1;}swap(s,front_i,i-1);front_i=i; }}return s;}
};
报错:

后来终于揪出来BUG了,在这里:
void swap(string& s,int left,int right){while(left!=right){ //这里不能用!=,得用<std::swap(s[left],s[right]);left++;right--;}}
当string的大小是偶数个时,!= 会导致left和right刚好错过。
果然是细节决定成败!!
思路1 遍历找单词
这题的思路蛮简单的:遍历一遍字符串,遇到单词,就把整个单词swap一下。
至于怎么找到单词?
可以通过空格的位置来划分单词。也可以遍历的时候记录下单词的起始位置。这两种找单词的方法都来实现一下。
实现
这种思路下的两种实现方式:
第一种:
class Solution {
public:void swap(string& s,int left,int right){while(left<right){std::swap(s[left],s[right]);left++;right--;}}string reverseWords(string s) {int num=s.size();int front_i=0;for(int i=0;i<num;i++){if(s[i]==' '){ //找到空格的位置if(front_i!=0){front_i+=1;}swap(s,front_i,i-1);front_i=i; }}//处理下最后一个词if(front_i!=0){front_i+=1;}swap(s,front_i,num-1);return s;}
};
第二种:这种方法我第一次没写出来,那个循环给我绕晕了。这种方法挺好的,得多写几遍!!!
class Solution {
public:string reverseWords(string s) {int num=s.size();int i=0;while(i<num){int start=i;while(i<num&&s[i]!=' '){ //注意看这个循环条件!!要加上i<num,保证安全i++;} //当出了循环,str[i]就是空格int left=start;int right=i-1;while(left<right){swap(s[left],s[right]);left++;right--;}
while(i<num&&s[i]==' '){ i++;}}return s;}
};
反思:
第二种思路我当时没写出来,问题就出在那个大循环while(i<num){}里,我当时一上来就把框架搭好了:
while(i<num)
{i++;
}
这个框架太经典了,结果限制住了我的思路。实际上,我不应该先把i++;写上的,后面得把这个循环多写几遍,多体会一下。
然后就是要注意,大while()里包小while(),小while()加上大while()的判断条件,会更安全,不容易越界。
思路2 暴力解法
思路1里,我们是手动翻转字符串的,但实际上可以直接用库里的reverse、find函数。
思路2则不用遍历字符串的每一个字符,而是用find找到空格,,然后从空格的后一个 接着去找 下一个空格。
当没有空格时,说明是最后一个单词,翻转,然后break跳出循坏。
注意,这种写法,循环里也没有经典的"i++;",所以不要一写循环就把i++;给添上,不要 被习惯限制住思路!
实现
class Solution {
public:string reverseWords(string s) {int num=s.size();int i=0;while(i<num){size_t pos=s.find(' ',i); //注意这里用size_tif(pos!=string::npos){reverse(s.begin()+i,s.begin()+pos); //因为是从i开始找的,所以要加ii=pos+1; //现在要从空格的下一位开始找} //注意reverse是左闭右开,右边是开区间else{reverse(s.begin()+i,s.end()); //没有空格了,说明这已经是最后一个单词了break;}}return s;}
};
相关文章:
【string题解 C++】字符串相乘 | 翻转字符串III:翻转单词
字符串相乘 题面 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigIn…...
CentOS 7下JumpServer安装及配置(超详细版)
前言 Jumpserver是一种用于访问和管理远程设备的Web应用程序,通常用于对服务器进行安全访问。它基于SSH协议,提供了一个安全和可管理的环境来管理SSH访问。Jumpserver是基于Python开发的一款开源工具,其提供了强大的访问控制功能,…...
基于 ACK Fluid 的混合云优化数据访问(五):自动化跨区域中心数据分发
作者:车漾 前文回顾: 本系列将介绍如何基于 ACK Fluid 支持和优化混合云的数据访问场景,相关文章请参考: -基于 ACK Fluid 的混合云优化数据访问(一):场景与架构 -基于 ACK Fluid 的混合云优…...
sentinel的启动与运行
首先我们github下载sentinel Releases alibaba/Sentinel (github.com) 下载好了后输入命令让它运行即可,使用cmd窗口输入一下命令即可 java -Dserver.port8089 -jar sentinel-dashboard-1.8.6.jar 账号密码默认都是sentinel 启动成功后登录进去效果如下...
模拟量采集无线WiFi网络接口TCP Server, UDP, MQTT
● 4-20mA信号转换成标准Modbus TCP协议 ● 支持TCP Server, UDP, MQTT等通讯协议 ● 内置网页功能,可以通过网页查询数据 ● 宽电源供电范围:8 ~ 32VDC ● 可靠性高,编程方便,易于应用 ● 标准DIN35导轨安装,方便…...
五、OSPF动态路由实验
拓扑图: 基本ip的配置已经配置好了,接下来对两台路由器配置ospf协议,两台PC进行跨网段通讯 R1与R2构成单区域OSPF区域0,首先对R1进行配置 首先进入ospf 默认进程1,router id省略空缺,之后进入area 0区域&…...
系统架构设计:16 论软件开发过程RUP及其应用
目录 一 统一过程RUP 1 典型特点 2 四个阶段 (1)构思阶段(初始阶段/初启阶段)...
Gralloc ION DMABUF in Camera Display
目录 Background knowledge Introduction ia pa va and memory addressing Memory Addressing Page Frame Management Memory area management DMA IOVA and IOMMU Introduce DMABUF What is DMABUF DMABUF 关键概念 DMABUF APIS –The Exporter DMABUF APIS –The…...
【LVS】lvs的四种模式的区别是什么?
LVS中的DR模式、NAT模式、TUN模式和FANT模式是四种不同的负载均衡模式,它们之间的主要区别在于数据包转发方式和网络地址转换。 DR模式(Direct Routing):此模式通过改写请求报文的目标MAC地址,将请求发给真实服务器&a…...
Android原生实现控件点击弹起效果方案(API28及以上)
之前在实现控件阴影时有提到过,阴影效果的实现采用的是Android原生的View的属性,拔高Z轴。Z轴会让View产生阴影的效果。 Zelevation translationZ 拔高Z轴可以通过控制elevation和translationZ。 我们之前是通过elevation来单纯的控制Z轴;而…...
【数据结构-队列 二】【单调队列】滑动窗口最大值
废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【单调队列】,使用【队列】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…...
如何设置CentOS系统以禁用不必要的网络端口和服务?
要禁用CentOS系统中的不必要的网络端口和服务,可以按照以下步骤进行操作: 1. 查看当前正在运行的服务和端口:使用以下命令可以查看正在运行的服务和对应的端口号。 sudo netstat -tuln 2. 停用不必要的服务:根据netstat命令的输…...
【IDEA项目个别类爆红,但是项目可以正常运行】
打开项目时发现idea个别类爆红,但是项目可以正常运行 问题原因:Idea本身的问题,可能是其缓存问题,导致爆红 解决方案:重置Idea 很多时候排查不出代码问题,就尝试一下此操作。 选择目录:File–>Invalida…...
hive 之select 中文乱码
此处的中文乱码和mysql的库表 编码 latin utf 无关。 直接上案例。 有时候我们需要自定义一列,有时是汉字有时是字母,结果遇到这种情况了。 说实话看到这真是糟心。这谁受得了。 单独select 没有任何问题。 这是怎么回事呢? 经过一番检查&…...
优化|优化处理可再生希尔伯特核空间的非参数回归中的协变量偏移
原文:Optimally tackling covariate shift in RKHS-based nonparametric regression. The Annals of Statistics, 51(2), pp.738-761, 2023. 原文作者:Cong Ma, Reese Pathak, Martin J. Wainwright 论文解读者:赵进 编者按: …...
Netty深入浅出Java网络编程学习笔记(一) Netty入门篇
目录 一、概述 1、什么是Netty 2、Netty的优势 二、入门案例 1、服务器端代码 2、客户端代码 3、运行流程 组件解释 三、组件 1、EventLoop 处理普通与定时任务 关闭 EventLoopGroup 处理IO任务 服务器代码 客户端代码 分工细化 划分Boss 和Work 增加自定义EventLoopGroup 切换…...
自动化产线集控系统(西门子CNC 840D/840DSL远程控制)
1.1项目背景 RQQ/VF120机组目前为1人操作3台机床,需在机台旁监控。为了改善人员在班中劳动强度非常大的现状,调整好每台机床的节奏,以保证机床的最少的等待时间。本项目旨在通过远程监视设备运行过程关键参数,操作人员人员可远程监…...
MVVM 与 MVC区别和应用场景?
MVVM 和 MVC 1. MVC2. MVVM 1. MVC MVC 是 Model View Controller 的缩写 Model:模型层,是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。View:视图层,用户界面渲染逻辑,通常视图…...
Linux开发-Ubuntu软件源工具
开发&验证环境: 操作系统:ubuntu 20.04 软件源:http://archive.ubuntu.com/ubuntu 开发工具 sudo apt install vim sudo apt install git# gnu工具链 sudo apt install gcc sudo apt install g sudo apt install gdb# llvm工具链 sudo …...
环境下载地址
1. DOTNET环境下载 适用于 Visual Studio 的 .NET SDK 下载 (microsoft.com)https://dotnet.microsoft.com/zh-cn/download/visual-studio-sdks...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
