【C++】string典型oj题

news2024/9/24 15:27:31

目录

  • 前言
  • 字符串相加
  • 字符串相乘
  • 字符串转换整数

请添加图片描述

前言

  上一节我们已经仔细讲解了关于string的各种重要接口的使用:【C++】string的使用。下面我们来使用这些接口写几道OJ题。

字符串相加

415.字符串相加-力扣
在这里插入图片描述
  这道题目的意思也很简单,就是想让我们模拟实现加法的过程。我们要搞清楚字符串如何相加,如何进位等一些问题即可。
  我们做加法都是从个位开始依次相加,因此我们可以通过下标+[]的形式取出每个字符数,再减去’0’,既是对应的数字。

如"123",想要取出个位数就是num[2]-‘0’,即可得到数字3。

然后就可以开始计算了。

  • 首先定义一个串,我们知道加法的结果最多只会比位数多的再多一位,因此我们就知道需要开多少空间。
  • 结束标志:只有当两个串的所有数字都加完后才结束
  • 进位计算。
  • 得到数字后进行头插(效率较低)
class Solution {
public:
    string addStrings(string num1, string num2) {
        string str;
        //开空间
        str.reserve(max(num1.size(), num2.size()) + 1);
        //知道两个串分别有多少位数
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        int next = 0;//进位
        while(end1 >= 0 || end2 >= 0)//只有当两个串的所有数字都加完后才结束
        {
        	//如果end1或者end2不大于0,证明它已经加完了,此时用0来填充
            int x1 = end1 >= 0 ? num1[end1--] - '0' : 0;
            int x2 = end2 >= 0 ? num2[end2--] - '0' : 0;
            int x = x1 + x2 + next;
            next = x/10;
            x = x%10;
            str.insert(str.begin(), x +'0');//头插,要加上'0'才是字符才能插入
        }
//例如9+1,它的x是0,已经插入了,但是进位next还没有加上,因此还要判断是否有多的进位没加上,如果有直接头插'1'即可。
        if(next == 1)
        {
            str.insert(str.begin(), '1');
        }
        return str;
    }
};

  我们知道头插的效率很低,上面代码的时间复杂度是O(n2),因此我们建议尾插,然后逆置即可。

	{
	//前面代码不变
	//...
	x = x%10;
	str += (x + '0');
	}
	if(next == 1)
    {
         str += '1';
    }
    reverse(str.begin(), str.end());//库里面已经提供好了的,在平时使用时要加上头文件#include<algorithm>
    return str;

字符串相乘

43.字符串相乘-力扣
在这里插入图片描述
  这道题和上一道字符串相加有着异曲同工之处。

  • 如果 num1和num2之一是 0,则直接将 0 作为结果返回即可。
  • 如果 num1和num 2都不是 0,则可以通过模拟「竖式乘法」的方法计算乘积。从右往左遍历乘数,将乘数的每一位与被乘数相乘得到对应的结果,再将每次得到的结果累加。这道题中,被乘数是 num 1,乘数是num2 。

需要注意的是,num2除了最低位以外,其余的每一位的运算结果都需要补 0。
在这里插入图片描述
然后对每次得到的结果(串)进行累加,就可以使用上一题字符串相加的方法。

class Solution {
public:
    string addStrings(string num1, string num2) {
        string str;
        str.reserve(max(num1.size(), num2.size()) + 1);
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        int next = 0;
        while(end1 >= 0 || end2 >= 0)
        {
            int x1 = end1 >= 0 ? num1[end1--] - '0' : 0;
            int x2 = end2 >= 0 ? num2[end2--] - '0' : 0;

            int x = x1 + x2 + next;

            next = x/10;
            x = x%10;

            //str.insert(str.begin(), x +'0');
            str += (x + '0');
        }

        if(next == 1)
        {
            //str.insert(str.begin(), '1');
            str += '1';
        }
        reverse(str.begin(), str.end());
        return str;
    }
    string multiply(string num1, string num2) {
        if(num1 == "0" || num2 == "0")
            return "0";
        string ans = "0";
        int m = num1.size();
        int n = num2.size();
        for(int i = n - 1; i >= 0; i--)
        {
            string cur;
            for(int j = n-1; j > i; j--)
                cur += '0';
            int next = 0;//进位
            int y = num2.at(i) - '0';
            for(int j = m-1; j >= 0; j--)
            {
                int x = num1[j]-'0';
                int product = x *y + next;
                next = product / 10;
                product = product % 10;
                cur += (product + '0');
            }
            if(next != 0)
            {
                cur += (next + '0');
            }
            reverse(cur.begin(), cur.end());
            ans = addStrings(ans,cur);
        }
        return ans;
    }
};

字符串转换整数

8.字符串转换整数(atoi)-力扣
在这里插入图片描述

函数 myAtoi(string s) 的算法如下:
空格:读入字符串并丢弃无用的前导空格(" ")
符号:检查下一个字符(假设还未到字符末尾)为 ‘-’ 还是 ‘+’。如果两者都不存在,则假定结果为正。
转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
舍入:如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。
返回整数作为最终结果。

我们对题目要求依次求解即可:

  1. 对于空格,只需要用while条件判断删除即可。
  2. 对于符号,给定一个变量flag,初始化为1,判断如果有'-',就将其置为-1,有’+‘或者没有就还是为1,有’+‘或’-'加加跳过即可。
  3. 判断是否为数字字符,如果是才能进入循环,不是则直接退出。
  4. 数字字符 - ‘0’ = 数字,数字拼接:res = res *10 +flag*(c - '0');即可得到最终数字。
  5. 数字越界处理:在每轮数字拼接前判断res在此轮拼接后是否超过/小于 INT_MAX/INT_MIN ,若超过则直接返回INT_MAX/INT_MIN。

在这里插入图片描述

class Solution {
public:
    bool isdigital(char c)
    {//判断是否是数字字符
        if(c >= '0' && c <= '9')
            return true;
        return false;
    }
    int myAtoi(string s) {
        int i = 0;
        int flag = 1;
        int res = 0;
        while(s[i]==' ')
        {//去掉空格
            ++i;
        }
        if(s[i]=='-')
            flag = -1;//记录负号
        if(s[i] == '-' || s[i] == '+')
            i++;
        int j = i;
        while(isdigital(s[j]) && j < s.size())//是数字字符再进循环
        {
            char c = s[j];//取出当前字符
            //判断越界
            if(res > INT_MAX /10 || (res == INT_MAX / 10 && (c-'0') > INT_MAX % 10))
                return INT_MAX;
            if(res < INT_MIN /10 || (res == INT_MIN / 10 && (c-'0') > -(INT_MIN % 10)))
                return INT_MIN;
            res = res *10 +flag*(c - '0');//拼接数字
            j++;
        }
        return res;
            
    }
};

感谢大家观看,如果大家喜欢,希望大家一键三连支持一下,如有表述不正确,也欢迎大家批评指正。
请添加图片描述

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

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

相关文章

什么是d3dx9_42.dll?如何将丢失的d3dx9_42.dll进行修复呢?

d3dx9_42.dll文件丢失什么情况&#xff1f;如何将丢失的d3dx9_42.dll进行修复呢&#xff1f;d3dx9_42.dll又是什么文件&#xff1f;d3dx9_42.dll 文件是一个由 Microsoft Corporation 开发的部分&#xff0c;属于 Microsoft DirectX for Windows 的一组庞大库集合中的一个。Dir…

ShellSweepPlus 介绍:开源 Web Shell 检测

ShellSweepPlus 概述 ShellSweepPlus是一款开源工具,旨在帮助安全团队检测潜在的 Web Shell。它是 ShellSweep 的增强版 Webshell 的威胁 Web shell 对组织构成重大威胁,因为它们为攻击者提供了对受感染 Web 服务器的未经授权的访问和控制。攻击者可以利用这些 shell 来:…

AI跟踪报道第53期-新加坡内哥谈技术-本周AI新闻: 谷歌老施讲,微软Phi 3.5和Search GPT

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

JavaScript初级——DOM和事件简介

一、什么是DOM&#xff1f; 二、模型 三、对象的 HTML DOM 树 四、节点 浏览器已经为我们提供了文档节点对象&#xff0c;这个对象是window属性&#xff0c;可以再网页中直接使用&#xff0c;文档节点代表的是整个网页。 五、事件简介 事件&#xff0c;就是用户和浏览器之间的交…

致远oa员工离职之后无法获取登录名

故事 前几天在做致远oa的携程平台的人员同步&#xff0c;碰见一个问题&#xff0c;致远oa人员离职之后&#xff0c;无法获取到人员的登录名&#xff0c;导致无法再携程平台做离职处理&#xff0c;因为客户要求的是用登录名作为携程编号 技术支持 感谢大佬对文章的技术支持 …

【git】git进阶-blame/stash单个文件/rebase和merge/cherry-pick命令/reflog和log

文章目录 git blame查看单个文件修改历史git stash单个文件git rebase命令git rebase和git merge区别git cherry-pick命令git reflog和git log区别 git blame查看单个文件修改历史 git blame&#xff1a;查看文件中每行最后的修改作者 git blame your_filegit log和git show结合…

探索Facebook的AI算法:如何优化用户体验

在数字化时代&#xff0c;社交媒体平台不断引领着技术创新的潮流。作为全球领先的社交平台之一&#xff0c;Facebook在人工智能&#xff08;AI&#xff09;算法的应用上取得了显著进展&#xff0c;极大地提升了用户的社交体验。本文将探讨Facebook如何通过先进的AI算法优化用户…

如何实现一棵红黑树

目录 1.什么是红黑树 2.红黑树的实现 2.1红黑树的插入 新插入的结点应该是什么颜色的呢&#xff1f; 插入情况的分析 ​编辑插入代码如下所示 2.2红黑树的查找 2.2检测红黑树 1.什么是红黑树&#xff1f; 红黑树是一棵接近平衡的二叉搜索树。由于AVL树在频繁大量改变数据…

MySQL字符串比较忽略尾随空格

问题 今天遇到一个线上问题&#xff0c;排查过程中发现&#xff0c;MySQL 查询条件使用字符串判断等时会自动忽略字符串尾部的空格&#xff0c;示例如下&#xff1a; MySQL 表格结构&#xff1a; CREATE TABLE users (id int(11) NOT NULL,name varchar(50) DEFAULT NULL,ag…

深度学习一(Datawhale X 李宏毅苹果书 AI夏令营)

一&#xff0c;机器学习基础 机器学习&#xff08;Machine Learning, ML&#xff09;是让机器具备学习能力的过程&#xff0c;其核心在于使机器能够自动寻找并应用复杂的函数&#xff0c;以解决各种任务如语音识别、图像识别和策略决策&#xff08;如AlphaGo&#xff09;。这些…

YoloV8改进策略:卷积篇|ACConv2d模块在YoloV8中的创新应用与显著性能提升|简单易用|即插即用

摘要 在本文中,我们创新性地将ACConv2d模块引入到YoloV8目标检测模型中,通过对YoloV8中原有的Conv卷积层进行替换,实现了模型性能的大幅提升。ACConv2d模块基于不对称卷积块(ACB)的设计思想,利用1D非对称卷积(13和31卷积)来增强标准方形卷积核(如33卷积)的表征能力。…

spring揭秘11-aop05-aop应用经典场景及目标对象内部方法调用无法被拦截

文章目录 【README】【1】基于aop实现全局异常处理【2】基于aop实现权限检查【3】基于aop实现缓存【4】aop无法拦截目标对象内部方法调用的问题【4.1】问题概述【4.2】解决方法 【README】 本文总结自《spring揭秘》&#xff0c;作者王福强&#xff0c;非常棒的一本书&#xf…

TFTP error: ‘Permission denied‘ (0)

项目场景&#xff1a; 环境&#xff1a;ubuntu 5.4.150 开发板&#xff1a;s3c2440 在u-boot中&#xff0c;通过tftp传输uImage文件失败。 问题描述 SMDK2410 # tftp 0x30008000 uImage dm9000 i/o: 0x20000000, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 00:0…

【变化检测】基于UNet建筑物变化检测

主要内容如下&#xff1a; 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、基于likyoo变化检测代码模型训练与预测 4、Onnx运行及可视化 运行环境&#xff1a;Python3.8&#xff0c;torch1.12.0cu113 likyoo变化检测源码&#xff1a;https://github.com/likyoo/change_dete…

数据仓库中的表设计模式:全量表、增量表与拉链表

在现代数据仓库中&#xff0c;管理和分析海量数据需要高效且灵活的数据存储策略。全量表、增量表和拉链表是三种常见的数据存储模式&#xff0c;各自针对不同的数据管理需求提供了解决方案。全量表通过保存完整的数据快照确保数据的一致性&#xff0c;增量表则通过记录数据的变…

如何在 Ubuntu 系统中安装PyCharm集成开发环境?

在上一篇文章中&#xff0c;我们探讨了Jupyter notebook&#xff0c;今天再来看看另一款常用的Python 工具&#xff0c;Pycharm。 PyCharm也是我们日常开发和学习常用的Python 集成开发环境 (IDE)&#xff0c;由 JetBrains 开发。 PyCharm 带有一整套可以帮助用户在使用Pytho…

大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

【代码随想录训练营第42期 Day39打卡 - 打家劫舍问题 - LeetCode 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

目录 一、做题心得 二、题目与题解 题目一&#xff1a;198.打家劫舍 题目链接 题解&#xff1a;动态规划 题目二&#xff1a;213.打家劫舍II 题目链接 题解&#xff1a;动态规划 题目三&#xff1a;337.打家劫舍III 题目链接 题解&#xff1a;动态规划 三、小结 一、…

卸载nomachine

网上的方法:提示找不到命令 我的方法: step1. 终端输入 sudo find / -name nxserver 2>/dev/null确认 NoMachine 的实际安装路径。你可以使用 find 命令在系统中查找 nxserver 脚本的位置。 找到路径后,你可以使用该路径来卸载 NoMachine。 如下图,紫色框中是我的路径…

【ACM出版】第三届公共管理、数字经济与互联网技术国际学术会议(ICPDI 2024,9月06-08)

第三届公共管理、数字经济与互联网技术国际学术会议&#xff08;ICPDI 2024&#xff09;定于2024年9月06-08日在中国-济南举行。 会议主要围绕公共管理、数字经济&#xff0c;互联网技术等研究领域展开讨论。会议旨在为从事公共管理、经济、大数据、互联网研究的专家学者提供一…