C++string类相关OJ练习(2)

news2024/12/22 23:09:57

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

C++string类相关OJ练习(2)

收录于专栏【C++语法基础
本专栏旨在分享学习C++的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

1.反转字符串

2.反转字符串 II

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

4.字符串相乘

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


1.反转字符串

OJ链接:344. 反转字符串 - 力扣(LeetCode)

题目描述:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 105
  • s[i] 都是 ASCII 码表中的可打印字符

解题思路:

收尾交换,进行翻转

class Solution {
public:
  void reverseString(vector<char>& s) 
  {
    if(s.empty())
      return;

    int start = 0;
    int end = s.size()-1;
    while(start < end)
    {
      swap(s[start], s[end]);
      start++;
      end--;
    }
  }
};

2.反转字符串 II

OJ链接:541. 反转字符串 II - 力扣(LeetCode)

题目描述:

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

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

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

提示:

  • 1 <= s.length <= 104
  • s 仅由小写英文组成
  • 1 <= k <= 104

解题思路:

写出反转函数,分情况讨论翻转 

class Solution {
public:
    //翻转start到end区间的字符串
    void Reverse(string& s, int start, int end)
    {
        char tmp;
        end--;
        while (start < end)
        {
            tmp = s[start];
            s[start] = s[end];
            s[end] = tmp;

            start++;
            end--;
        }
    }

    string reverseStr(string s, int k)
    {
        int len = s.size();
        for (int i = 0; i < len; i += 2 * k)
        {
            if (i + k < len)
                Reverse(s, i, i + k);
            else
                Reverse(s, i, len);
        }
        return s;
    }
};

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

题目描述:

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

示例 1:

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

示例 2:

输入: s = "Mr Ding"
输出:"rM gniD"

提示:

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

解题思路:

1. 通过查找空格,分割单词

2. 针对分割的单词进行翻转

class Solution {
public:
    void Reverse(string& s, int start, int end)
    {
        char tmp;
        while (start < end)
        {
            tmp = s[start];
            s[start] = s[end];
            s[end] = tmp;

            start++;
            end--;
        }
    }

    string reverseWords(string s)
    {
        size_t start = 0;
        size_t end = 0;

        while (start < s.size())
        {
            //s.find(' ', start);从start位置开始找空格
            end = s.find(' ', start);
            if (end == string::npos)
            {
                end = s.size();
                break;
            }

            Reverse(s, start, end - 1);
            start = end + 1;
        }
        Reverse(s, start, end - 1);
        return s;
    }
};

4.字符串相乘

OJ链接:43. 字符串相乘 - 力扣(LeetCode)

题目描述:

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

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

示例 1:

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

示例 2:

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

提示:

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

解题思路:

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;
            }
            else
                sign = 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;
        }
        else
            sign = 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的每一个数据乘以num1
            MulItem(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;
    }
};

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

OJ链接:LCR 192. 把字符串转换成整数 (atoi) - 力扣(LeetCode) 

题目描述:

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

  1. 读入字符串并丢弃无用的前导空格
  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
  4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
  5. 如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
  6. 返回整数作为最终结果。

注意:

  • 本题中的空白字符只包括空格字符 ' ' 。
  • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例 1:

输入:s = "42"
输出:42
解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。
第 1 步:"42"(当前没有读入字符,因为没有前导空格)
         ^
第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
         ^
第 3 步:"42"(读入 "42")
           ^
解析得到整数 42 。
由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。

示例 2:

输入:s = "   -42"
输出:-42
解释:
第 1 步:"   -42"(读入前导空格,但忽视掉)
            ^
第 2 步:"   -42"(读入 '-' 字符,所以结果应该是负数)
             ^
第 3 步:"   -42"(读入 "42")
               ^
解析得到整数 -42 。
由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。

示例 3:

输入:s = "4193 with words"
输出:4193
解释:
第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格)
         ^
第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
         ^
第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止)
             ^
解析得到整数 4193 。
由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。

解题思路:

1.首先除去不必要的字符

2.用sign存贮'-'和'+',以便后续进行正负判断

3.读取数字段字符,需要注意的是,我们使用border(INT_MAX/10)进行判断,作用为:

        i. 用低于int型数据长度一位的数据border判断了超过int型数据长度的值 
        ii. 将超过最大值和低于最小值的情况都包括了

 INT_MAX和INT_MIN

int main()
{
    int end = INT_MAX / 10;
    int end2 = INT_MIN;
    cout << end << endl; 
    cout << INT_MAX << " " << end2 << endl;
    return 0;
}

 

class Solution {
public:
    int myAtoi(string str)
    {
        bool sign = true;   //默认为正数
        // 跳过开头可能存在的空格
        int i = 0;
        while (i < str.size() && str[i] == ' ')
        {
            i++;
        }
        //接着判断首个字符是否为正负号
        if (str[i] == '-')
        {
            sign = false;  // 该字符串为负数,移至下一个字符接着判断
            i++;
        }
        else if (str[i] == '+')  // 字符串为正数,sign已经默认为true,直接移动到下一位即可
            i++;
        //下面开始对非正负符号位进行判断
        if (str[i] < '0' || str[i] > '9') // 正常数字第一位不能是0,必须为1~9之间的数字,否则就是非法数字
            return 0;
        int res = 0;   //这里res用的int型,需要更加仔细考虑边界情况,但如果用long的话可以省去一些麻烦
        int num = 0;
        //INT_MAX是int能达到的最大值2^31-1 = 2147483648
        int border = INT_MAX / 10;  // 用来验证计算结果是否溢出int范围的数据
        while (i < str.size())
        {
            // 遇到非数字字符,则返回已经计算的res结果
            if (str[i] < '0' || str[i] > '9')
                break;
            // 注意这句话要放在字符转换前,因为需要验证的位数比实际值的位数要少一位, 这里比较巧妙的地方在于
            // 1. 用低于int型数据长度一位的数据border判断了超过int型数据长度的值 
            // 2. 将超过最大值和低于最小值的情况都包括了
            if (res > border || res == border && str[i] > '7')
                return sign == true ? INT_MAX : INT_MIN;
            //开始对数字字符进行转换
            num = str[i] - '0';
            res = res * 10 + num;
            i++;
        }
        //最后结果根据符号添加正负号
        return sign == true ? res : -res;
    }
};


int main()
{
    int end = INT_MAX / 10;
    cout << end << endl; 
    cout << INT_MAX << endl;
    return 0;
}

 

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

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

相关文章

录屏软件电脑,精选5款录屏神器推荐

嘿&#xff0c;朋友们&#xff01;想象一下&#xff0c;你正在与好友分享你最新的游戏成就&#xff0c;或是与同事展示你的最新项目进展&#xff0c;但却发现文字描述无法完美呈现你的精彩瞬间。别担心&#xff0c;在这个数字化的时代&#xff0c;我们有着无数种方式记录和分享…

大型集团行业ITSM案例分析报告

一、项目背景 随着信息化建设的不断推进&#xff0c;大型集团的信息系统规模迅速扩大&#xff0c;业务系统对IT的依赖程度逐渐加深&#xff0c;IT网络应用系统的复杂度也随之增加。然而&#xff0c;相对滞后的运维服务体系却未能同步跟进&#xff0c;运维要求不断提高的同时&a…

SparkRA带你读论文 | 如何训练数据高效的 LLMs

简介 How to Train Data-Efficient LLMs 论文作者&#xff1a; Noveen Sachdeva, Benjamin Coleman, Wang-Cheng Kang, Jianmo Ni, Lichan Hong Ed H. Chi, James Caverlee, Julian McAuley, Derek Zhiyuan Cheng 论文链接&#xff1a; https://arxiv.org/pdf/2402.09668.pd…

Java CRM客户关系管理系统源码:基于Spring Cloud Alibaba与Spring Boot,专为成长型企业设计

项目名称&#xff1a;CRM客户关系管理系统 功能模块及描述&#xff1a; 一、待办事项 今日需联系客户&#xff1a;显示当日需跟进的客户列表&#xff0c;支持查询和筛选。分配给我的线索&#xff1a;管理分配给用户的线索&#xff0c;包括线索列表和查询功能。分配给我的客户…

Hive数据库与表操作全指南

目录 Hive数据库操作详解 创建数据库 1&#xff09;语法 2&#xff09;案例 查询数据库 1&#xff09;展示所有数据库 &#xff08;1&#xff09;语法 &#xff08;2&#xff09;案例 2&#xff09;查看数据库信息 &#xff08;1&#xff09;语法 &#xff08;2&#…

【免费分享】嵌入式Linux开发板【入门+项目,应用+底层】资料包一网打尽,附教程/视频/源码...

想要深入学习嵌入式Linux开发吗&#xff1f;现在机会来了&#xff01;我们为初学者们准备了一份全面的资料包&#xff0c;包括原理图、教程、课件、视频、项目、源码等&#xff0c;所有资料全部免费领取&#xff0c;课程视频可试看&#xff08;购买后看完整版&#xff09;&…

U盘提示需要格式化才能使用怎么办?教你轻松应对

U盘作为一种便捷的数据存储设备&#xff0c;广泛应用于日常工作和生活中。然而&#xff0c;有时我们会遇到U盘插入电脑后提示需要格式化才能使用的情况&#xff0c;这让人倍感焦虑&#xff0c;因为格式化往往意味着数据丢失。不过&#xff0c;在采取极端措施之前&#xff0c;我…

如何验证mos管好坏

用万用表的二极管档位测试&#xff0c;只有D&#xff08;&#xff09;S&#xff08;-&#xff09;之间电压低于0.7v&#xff0c;其他任意两脚之间电压都是大于1.5V。这是正常的。

不限专业和工作经验,这个含金量巨高的IT证书,90%的大学生都不知道!

软考现在正在报名阶段&#xff0c;大学生们千万不要错过&#xff01;这个IT证书的含金量巨高&#xff0c;对你的大学生涯乃至毕业后的职业规划都有帮助&#xff01; 下面就来为大家详细讲解一番&#xff0c;速速码住&#xff01; 1、软考报名条件 软考报名没有学历、资历、年龄…

【Python常用库_1】网络安全清洁专家——Bleach

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要分享常用的一些Python库&#xff0c;让工作学习事半功倍&#xff0c;适用于平时学习、工作快速查询等…

CPP多态

目录 前言 多态的概念 多态的定义及实现 多态的构成条件 虚函数 虚函数的重写 虚函数重写的两个例外 C11 override 和 final 重载、覆盖(重写)、隐藏(重定义)的对比 抽象类 接口继承和实现继承 多态的原理 虚函数表 多态的原理 动态绑定与静态绑定 单继承和多继…

Aspose.PDF功能演示:在 C# 中将 JPG 图像合并为 PDF

Aspose.PDF 是一款高级PDF处理API&#xff0c;可以在跨平台应用程序中轻松生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现&#xff0c;保护和打印文档。无需使用Adobe Acrobat。此外&#xff0c;API提供压缩选项&#xff0c;表创建和处理&#xff0c;图形和图像功能&am…

网安新声 | 智能家居时代,用户隐私谁来守护

网安加社区【网安新声】栏目&#xff0c;汇聚网络安全领域的权威专家与资深学者&#xff0c;紧跟当下热点安全事件、剖析前沿技术动态及政策导向&#xff0c;以专业视野和前瞻洞察&#xff0c;引领行业共同探讨并应对新挑战的策略与可行路径。 近日&#xff0c;某知名品牌旗下的…

【初领妙道】一眼学会Redis之重点大纲

重点大纲 1. Redis基础2. Redis核心功能3. 高级特性4. 性能优化5. 高可用性6. 安全性7. 实战应用8. 监控与运维总结 Redis&#xff08;Remote Dictionary Server&#xff09;是一款开源的、高性能的键值存储系统&#xff0c;它支持多种数据结构&#xff0c;如字符串、列表、集合…

STL算法详细解剖——单纯数据处理函数

STL算法详细解剖——单纯数据处理函数 前言1.replace 替代函数值2.replace_copy 替代函数值3.replace_if 替代函数值4.replace_copy_if 替代函数值5.reverse 颠倒排序6.reverse_copy 颠倒排序7.rotate 将元素按某个中间值进行互换7.1.rotate 将元素按某个中间值进行互换8.roate…

hex文件转bin文件

一、简介 在进行MCU开发时,经常需要使用到hex和bin文件,这里总结几种hex转bin的方法。 二、MDK转换 很多的MCU开发,都会用到MDK,而MDK自身是可以执行批处理,来完成hex到bin文件的直接转化的。 见如下指令: fromelf --bin -o ..\..\output\@L.bin #L 这里解释一下上面指令…

音频在线转换mp3:学会这2个方法,拿捏音频转换

如今音频文件的格式转换变得越发重要。你是否曾因为无法在设备上播放特定格式的歌曲而感到困扰&#xff1f;你是否希望将原有的音频文件转换为更常见、更通用的mp3格式&#xff0c;以便在不同设备上畅快地品味音乐&#xff1f; 为了音频文件的顺利播放&#xff0c;我们需要学会…

SpringBoot 增量部署发布

一、背景介绍 由于项目依赖的jar越来越多&#xff0c;Springboot默认的打包方式是将整个项目打包成一个jar包&#xff0c;每次发布时&#xff0c;打包后的jar越来越大&#xff0c;更新一个很小的功能&#xff0c;需要将整个jar上传运行。这样效率太低了&#xff0c;考虑实现每…

2024年百元蓝牙耳机推荐有哪些?四款年度热门机型评测推荐

随着蓝牙技术的不断成熟和普及&#xff0c;蓝牙耳机已经悄然成为我们日常生活中不可或缺的一部分&#xff0c;特别是在2024年&#xff0c;市面上涌现出了许多性价比极高的百元蓝牙耳机&#xff0c;那么在众多的蓝牙耳机里2024年百元蓝牙耳机推荐有哪些&#xff1f;为了解决大家…

【Java】实体类Javabean

文章目录 前言一、实体类Javabean是什么&#xff1f;二、代码总结 前言 记录实体类的基本语法 一、实体类Javabean是什么&#xff1f; 其实就是一种特殊形式的类&#xff0c;这种类特殊点在于&#xff1a; 1、这个类中的成员变量都要私有&#xff0c;并且要对外提供相应的ge…