【C++初阶7-stringOJ】上手用一下

news2024/11/26 15:40:52

前言

本期通过几道OJ题,上手用用string。


1. 把字符串转换成整数

描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0

数据范围:字符串长度满足0 ≤ n ≤100
进阶:空间复杂度 O(1) ,时间复杂度 O(n)

注意

①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0

②字符串中可能出现 +/- 且仅可能出现在字符串首位。

输入描述

输入一个字符串,包括数字字母符号,可以为空

返回值描述

如果是合法的数值表达则返回该数字,否则返回0

示例1

输入

"+2147483647"

返回值

2147483647

示例2

输入

"1a33"

返回值

0

思路+算法

遍历,判断每次遍历到的元素

  • 是’+':跳过
  • 是’-':保存标记
  • 是数字字符:加进 int的sum
  • 其他(非法):返回0

实现

class Solution {
public:
    int StrToInt(string str) 
    {
        int flag = 1;
        long long ret = 0;

        for(size_t i = 0; i < str.size(); ++i)
        {
            if(str[i] == '+')
                continue;
            else if(str[i] == '-')
                flag = -1;
            else if(str[i] >= '0' && str[i] <= '9')
                ret = ret * 10 + (str[i]-'0');
            else
                return 0;
        }

        return flag * ret;
    }
};

2.字符串相加

给定两个字符串形式的非负整数 num1num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

示例 1:

输入:num1 = "11", num2 = "123"
输出:"134"

示例 2:

输入:num1 = "456", num2 = "77"
输出:"533"

提示:

  • 1 <= num1.length, num2.length <= 104
  • num1num2 都只包含数字 0-9
  • num1num2 都不包含任何前导零

思路和算法

直接模拟竖式加法:和的某一位 = 两数某一位的和 + 先前留下的进位。

竖式加法从后往前加即可。

实现

class Solution {
public:
    //和的当前位 = 两数当前位的和 + 进位
    string addStrings(string num1, string num2) 
    {
        string ret;
        int n = num1.size() > num2.size() ? num1.size() : num2.size();  
        ret.reserve(n+1);   //最大的两个n位数相加也只可能是n+1位数

        int i = num1.size() - 1, j = num2.size() - 1, add = 0;
        while(i >= 0 || j >= 0 || add != 0)
        {
            //用int相加
            int x = i >= 0 ? num1[i]-'0' : 0;
            int y = j >= 0 ? num2[j]-'0' : 0;
            int sum = x + y + add;

            //保存char
            ret.push_back((sum % 10) + '0');

            //保存进位
            add = sum / 10;

            --i;
            --j;
        }

        reverse(ret.begin(), ret.end());

        return ret;
    }
};
  • reserve提前开好空间,避免频繁扩容
  • 同时遍历两个容器,可以用逻辑或来一口气弄完(逻辑要自洽)。

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

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

示例 1:

输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

示例 2:

输入: s = "God Ding"
输出:"doG gniD"

提示:

  • 1 <= s.length <= 5 * 104
  • s 包含可打印的 ASCII 字符。
  • s 不包含任何开头或结尾空格。
  • s至少 有一个词。
  • s 中的所有单词都用一个空格隔开。

思路和算法

遍历s,找空格前保存当前位置start ==> 找空格位置i ==> 交换区间[start, i]中的数据 ==> 跳过空格

实现

class Solution {
public:
    //遍历找空格并记录区间,找到空格就交换区间内数据
    string reverseWords(string s) 
    {
        int len = s.size();
        int i = 0;
        while(i < len)
        {
            int start = i;
            //找空格
            while(i < len && s[i] != ' ') ++i;

            //交换
            int left = start, right = i - 1;
            while(left < right) swap(s[left++], s[right--]);

            //跳过空格
            while(i < len && s[i] == ' ') ++i;
        }
        return s;
    }
};

4. 字符串相乘

给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

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

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1num2 只能由数字组成。
  • num1num2 都不包含任何前导零,除了数字0本身。

思路和算法

在这里插入图片描述

123 * 6 = 3*6 + 2*6 + 1*6

123 * 5 = 3*5 + 2*5 + 1*5

123 * 4 = 3*4 + 2*4 + 1*4

思路仍然是模拟竖式,不过这次是 两数的各个位都从后向前乘,再将乘积相加(可以把字符串相加拿过来用一下)。

实现

class Solution {
public:
  	//模拟竖式计算
    string multiply(string num1, string num2) 
    {
        if(num1 == "0" || num2 == "0")
            return "0";

        //123 * 456 =
        //123 * 4
        //123 * 5
        //123 * 6 
        string ans = "0";

        //整形计算
        int n1 = num1.size(), n2 = num2.size();
        //i 拿 6 5 4
        for(int i = n2 - 1; i >= 0; --i)
        {
            string cur;     //保存一次乘积,如123 * 4
            int add = 0;    //保存进位

            for(int j = n2 - 1; j > i; --j) cur.push_back(0); //补0
            //123 * 4
            //123 * 5
            //123 * 6 
            //j 拿 1 2 3
            int y = num2[i] - '0';
            for(int j = n1 - 1; j >= 0; --j)
            {
                //3 * 4 
                //3 * 5
                //3 * 6
                int x = num1[j] - '0';
                int product = x * y + add;
                cur.push_back(product % 10);
                add = product / 10;
            }

            //加上进位
            while(add)
            {
                cur.push_back(add % 10);
                add /= 10;
            }

            reverse(cur.begin(), cur.end());
            //保存字符
            for(auto& e : cur) e += '0';

            ans = addStrings(ans, cur);
        }

        return ans;
    }

    string addStrings(string num1, string num2) 
    {
        string ret;
        int n = num1.size() > num2.size() ? num1.size() : num2.size();  
        ret.reserve(n+1);   //最大的两个n位数相加也只可能是n+1位数

        int i = num1.size() - 1, j = num2.size() - 1, add = 0;
        while(i >= 0 || j >= 0 || add != 0)
        {
            //用int相加
            int x = i >= 0 ? num1[i]-'0' : 0;
            int y = j >= 0 ? num2[j]-'0' : 0;
            int sum = x + y + add;

            //保存char
            ret.push_back((sum % 10) + '0');

            //保存进位
            add = sum / 10;

            --i;
            --j;
        }

        reverse(ret.begin(), ret.end());

        return ret;
    }
};

今天的分享就到这里了,感谢观看!

这里是培根的blog,期待与你共同进步,

下期见~

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

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

相关文章

【读书笔记】万物原理——打开客观世界与主观情感的大门

被尹烨老师推荐种草的&#xff0c;以为是一本讲生命科学的科普书&#xff0c;看上了又以为是说量子物理等高端科学研究的&#xff0c;最后被互补性理论惊到了。这哪里只是一本打开认知客观世界的大门&#xff0c;还让我重识内心。那些看不见摸不着的情感&#xff0c;比如同情心…

数字孪生十大问题有哪些?通俗解释指的是什么?

数字孪生&#xff08;Digital Twins&#xff09;之火热&#xff0c;已经成为了一个不争的事实。数字孪生的概念&#xff0c;起源于制造业&#xff0c;现在已广泛应用到了智慧城市、智慧交通、智慧农业、智慧医疗、智能家居等行业。数字孪生十大问题有哪些&#xff1f;指的是什么…

018 | 服饰颜色与族群名称对颜色认知的影响 | 大学生创新训练项目申请书 | 极致技术工厂

研究目的 本项目以瑶、壮、汉三个民族、六个族群为研究对象&#xff0c;通过七个实验探索服饰颜色与族群名称对颜色认知的影响。重点提出以下两个问题&#xff1a; &#xff08;1&#xff09;服饰颜色是否影响少数民族个体的颜色偏好&#xff1f; &#xff08;2&#xff09;服…

刷完 300 道 LeetCode 题后,我膨胀到要飘起来了!纯正 Java 版

算法题就好像科举考试时代背的八股文&#xff0c;是知识改变命运的代表作。你不刷&#xff0c;不管是校招还是社招&#xff0c;就很过算法题这一关。 我整理的这份 LeetCode 刷题笔记足足 300 道&#xff0c;对算法薄弱和需要提高算法的同学很有帮助。 随便打开一道题解感受下…

【云原生】监视Docker桌面的容器内存和CPU使用情况

目录 一、如何监视Docker桌面的容器内存和CPU使用情况 1、stats命令 2、Docker 统计命令stats是如何工作的 2.1、命令与描述 2.2、OPTIONS 2.3、例子 2.4、格式化 3、满足资源使用扩展 4、如何安装“资源使用情况”扩展插件&#xff1f; 5、总结 一、如何监视Docker桌…

SQL记录

DateDiff函数 定义和用法 DATEDIFF() 函数返回两个日期之间的天数。 语法 DATEDIFF(date1,date2) date1 和 date2 参数是合法的日期或日期/时间表达式。 注释&#xff1a;只有值的日期部分参与计算。 实例 下面是 SELECT 语句&#xff1a; SELECT DATEDIFF(‘2008-11-30’,‘2…

WinRar去除弹窗广告的学习和研究

不可否认WinRar是一款优秀的解压缩软件&#xff0c;尤其是在Windows中使用还是较频繁的。 但是使用时弹出&#xff1a; 这就有点难受了。 那么怎么解决呢&#xff1f;好吧&#xff0c;以学习和研究为目的开始折腾...... 经过对WinRar不同版本的试用&#xff0c;原来这个弹窗是…

ubuntu修改网易云音乐分辨率显示

问题 网易云音乐不能随着系统显示的缩放比自动调整&#xff0c;分辨率较高的显示器上界面显示特别小。只能通过如下的办法解决&#xff1a; ubuntu修改网易云音乐分辨率显示&#xff0c;也就是修改显示 DPI 。 方法 sudo vim /usr/share/applications/netease-cloud-music.d…

12月12日

centos7查找java在哪&#xff0c;which java确认环境变量是否生效&#xff0c;可以输出一下&#xff1a;echo $JAVA_HOME同一个github账号上的所有的项目只需配置一次私钥和公钥&#xff0c;私钥和公钥的作用是你本机ip和这个账户所在github约定的一个对接方式&#xff0c;配置…

微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.5 实现AT 模式

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式事务 文章目录微服务框架分布式事务38 动手实践38.5 实现AT 模式38.5.1 实现 AT 模式38 动手实践 38.5 实现AT 模式 38.5.1 实现 AT…

docker部署mysql问题汇总

部署命令 注意conf文件在实际容器中的位置&#xff0c;有的版本是直接在/etc目录下&#xff0c;可以先创建一个容器进去看看 docker run --restartalways --privilegedtrue \ -v $PWD/mysql/data/:/var/lib/mysql \ -v $PWD/mysql/logs/:/var/log/mysql \ -v $PWD/mysql/con…

Shell脚本学习指南(七)——产生脚本

文章目录前言路径查找软件构建自动化前言 本篇&#xff0c;我们将进一步处理更复杂的工作。我们认为这里举出的例子都是一般用得到的工具&#xff0c;它们每一个都截然不同&#xff0c;且在大多数UNIX工具集里也没有。 在篇中的程序&#xff0c;包括命令行参数分析、在远程主…

电气数据|IEEE118(含风能太阳能)

1 概述 在本科或者研究生写论文时&#xff0c;经常需要用到很多数据&#xff0c;所以数据显得尤为重要。 下面这段文字&#xff0c;为了字数需要&#xff0c;所以可以忽略。 现代这种“探索、征服”的心态&#xff0c;从世界地图的演变可以看得一目了然。早在历史进到现代之前…

猿如意中的【PyCharm社区版】工具详情介绍

猿如意中的【PyCharm社区版】工具详情介绍&#xff0c;手把手教你使用猿如意下载、安装和配置【PyCharm社区版】&#xff0c;希望能帮助到有需要的童鞋。 文章目录前言一、猿如意介绍二、PyCharm社区版开发工具简介1.【PyCharm专业版】和【PyCharm社区版】的功能区别2.【PyChar…

新兴新能源设施[1]--盐穴压缩空气储能相关配套设施

新兴新能源设施[1]--盐穴压缩空气储能相关配套设施前言1. 什么是盐穴压缩空气储能&#xff1f;2. 盐穴储气的相关应用案例2.1 江苏常州应用案例2.2 衡阳压缩空气储能项目2.3 山东肥城10MW盐穴压缩空气储能系统3. 气-液、油-水界面信息探测和信息传输3.1 中子寿命测试油水界面&a…

一种近红外区荧光染料:ICG-Tetrazine,ICG-TZ,在影像医学,光热 等都会有一定的应用

凯新生物一种近红外区荧光染料&#xff0c;Cy系列&#xff08;花菁类&#xff09;染料&#xff08;630-670 nm、650-700 nm&#xff09;&#xff0c;在影像医学&#xff0c;光热 等都会有一定的应用。和四嗪基团进行结合&#xff0c;进行相应的荧光标记。 【英文名称】 ICG-Te…

Linux 的常用命令

前言 本篇博客给大家介绍一些常见的 Linux 命令 目录操作 pwd 查看当前工作目录 clear 清除屏幕 cd ~ 当前用户目录 cd / 根目录 cd - 上一次访问的目录 cd .. 上一级目录 其中清除屏幕的快捷键是: ctrl l ls 语法: ls 选项 目录或文件 功能: 对于目录来说…

VS实现一个爬虫程序<c++>获取网页源代码

目的:写一个爬虫程序,可以进入http开头的网页,将网页的源代码显示出来. 结果展示: 思路: 1.解析网址 2.连接服务器->发请求 3.接收源代码并存储起来 函数: 1.解析网址函数: http://......./...... //....../之间的字符我们将其存储到urlAddr[]当中 /......之后的字符…

CentOS7安装Docker

1. 确定是CentOS8及其以上版本 $cat /etc/redhat-release 2. 卸载旧版本 $sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 3. yum安装gcc相关 $yum -y install g…

自动化部署npm安装sass是报错,往往是node版本太高导致的

本想尝试一下github的自动化部署&#xff0c;将一个vue项目部署到github pages上面&#xff0c;结果报错&#xff1a; 报错&#xff1a; npm ERR! code 1 50npm ERR! path /home/runner/work/CvReport/CvReport/node_modules/node-sass 51npm ERR! command failed 52npm ERR!…