string类练习题

这篇具有很好参考价值的文章主要介绍了string类练习题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

string类练习题,刷题集,算法,c++,c语言

前言

本篇博客主要记录string类的相关oj题,后续会持续更新,题目为入门基础题,目的是帮助初学string类的友友们熟悉使用string类.
题目包含:字符串最后一个单词的长度、 2.反转字符串 II、字符串相加

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

题目来源于:牛客
题目链接:传送门

1.1 题目介绍

计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)

输入描述:

输入一行,代表要计算的字符串,非空,长度小于5000

输出描述:

输出一个整数,表示输入字符串最后一个单词的长度。

示例1:

输入:

hello nowcoder

输出:

8

说明:

最后一个单词为nowcoder,长度为8

1.2 解题思路:

  1. 创建一个string类对象input.
  2. 通过getline函数获取带有空格的字符串.
  3. 通过遍历这个字符串,进行计数,途中遇到空格就将num清零.(因为表示不是最后一个单词)
  4. 最后返回num即可.

1.3 题目代码

#include <iostream>

using namespace std;

int main() {
    string input;
    
    getline(cin, input);//获取一行字符串
    
    int num=0;//记录单词的长度
    for(int i=0;i<input.size();i++)
    {
        if(input[i]==' ')num=0;//每次遇到空格都清零
        else num++;
    }
   cout<<num<<endl;
   return 0;
    
}

方法二:

  1. 从后往前遍历,遇到第一个空格,则表示最后一个单词结束,即返回长度.
#include <iostream>

using namespace std;

int main() {
     string input;
    getline(cin, input);//获取行
    int num=0;
    for(int i=input.size()-1;i>=0;i--)
    {
       if(input[i]==' ')break;
         num++;   
    }
   cout<<num<<endl;
   return 0;  
}

知识点:

  1. getline函数可以获取带有空格的字符串.
  2. string对象的长度通过调用对象的size()函数获得.

二、反转字符串 II

题目来源于:力扣
题目链接:传送门

2.1 题目介绍

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

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

示例1:

输入:s = “abcdefg”, k = 2
输出:“bacdfeg”

示例2:

输入:s = “abcd”, k = 2
输出:“bacd”

2.2 解题思路

  1. 遍历string类对象,每次走到2k的倍数时,反转前k个字符.
  2. 当剩下的字符串不足k个的时候,反转剩下的所有字符.

2.3 题目代码:

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.size();
        for (int i = 0; i < n; i += 2 * k) {
            if(i+k>n)//剩余字符串不足k
            {
                reverse(s.begin() + i ,s.begin()+n);//反转剩下的所有字符
            }
            else
            reverse(s.begin() + i, s.begin() +i+k);反转前k个字符
        }
        return s;
    }
};

知识点:

  1. begin()用于返回string对象的起始位置.
  2. reverse函数可以用于实现反转,reverse(开始位置,结束位置);

三、字符串相加

题目来源于:力扣
题目链接:传送门

3.1 题目介绍

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

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

示例 1:

输入:num1 = “11”, num2 = “123”
输出:“134”

示例 2

输入:num1 = “456”, num2 = “77”
输出:“533”

示例 3:

输入:num1 = “0”, num2 = “0”
输出:“0”

3.2 解题思路:

  1. 从后往前同时遍历这两个string类对象.
  2. 计算两个对象的和,用carry 记录是否需要进位.
  3. 将和的结果尾插入sum对象(用于保存最后的和的输出结果).
  4. (1)如果对象1没有走完,对象2已经走完,则对象1剩余部分+进位继续处理尾插入sum对象.
    (2)如果对象2没有走完,对象1已经走完,则对象2剩余部分+进位继续处理尾插入sum对象.
  5. 细节处理:最后一个数也可能进位,例如99+1=100.
  6. 将计算结果反转.

为何要反转?
string类练习题,刷题集,算法,c++,c语言
因为计算结果是尾插进入sum对象的,那为啥非要尾插呢?头插不行吗?
学过顺序表的友友们应该知道:

  1. 尾插:顺序表的尾插的效率极高,时间复杂度是O(1);
  2. 头插,顺序表的头插效率极低,时间复杂度是O(n);.

进位数说明:

题目要求一个结点只能存个位数,所以需要保留进位数到下一个结点.

算进位数:
这是很基本的数学问题,两数相加,大于10的部分需要进位.

3.3 题目代码:

class Solution {
public:
    string addStrings(string num1, string num2) {
        int carry = 0;
        string sum;
        //分别获取两个对象最后一个字符的小标位置
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        while (end1>=0 && end2>=0)
        {
            int num = num1[end1--] - '0' + num2[end2--] - '0' + carry;
            //处理进制
            carry = num / 10;
            //只保留个位数
            num %= 10;
			//将和的结果尾插入sum对象
            sum.push_back(num + '0');
        }
        //如果对象1没有走完
        while (end1>=0)
        {
            int num = num1[end1--] - '0' + carry;
            //处理进制
            carry = num / 10;
            //只保留个位数
            num %= 10;
            sum.push_back(num + '0');
        }
        //如果对象2没有走完
        while (end2>=0)
        {
            int num = num2[end2--] - '0' + carry;
            //处理进制
            carry = num / 10;
            //只保留个位数
            num %= 10;
            sum.push_back(num + '0');
        }
        //最后一个位是否需要进位
        if(carry==1)
        {
             sum.push_back('1');
        }
		//将最终结果反转
        reverse(sum.begin(), sum.end());
        return sum;
    }
};

优化版本(推荐写法)

建议画图分析:

class Solution {
public:
    string addStrings(string num1, string num2) {
        int carry = 0;
        string sum;
        //计算最后一个字符的下标
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        while (end1 >= 0 || end2 >= 0)
        {    
            //谁短,谁就为'0'
            char s1 = end1 >= 0 ? num1[end1] : '0';
            char s2 = end2 >= 0 ? num2[end2] : '0';
      
            int num = s1-'0' + s2-'0' + carry;
            //处理进制
            carry = num / 10;
            //只保留个位数
            num %= 10;
            sum.push_back(num + '0');
            end1--;
            end2--;
        }
        //防止最后一个字符的进位问题
        if (carry == 1)
        {
            sum.push_back('1');
        }
        //最后反转字符串
        reverse(sum.begin(), sum.end());
        return sum;
    }
};

好的,初次接触string类的友友们注意多加练习,刷完这些题目以后,对string类的使用是不是更加熟悉了呢?
string类练习题,刷题集,算法,c++,c语言文章来源地址https://www.toymoban.com/news/detail-602676.html

到了这里,关于string类练习题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言习题练习

    首先我们要了解什么是offsetof宏: . 此具有函数形式的宏返回数据结构或联合类型中成员成员的偏移值(以字节为单位)。 . 返回的值是size_t类型的无符号整数值,其字节数位于指定成员与其结构开头之间。 什么意思呢,可以看到下面这张图片: 下面我们来看到这一习题:

    2024年02月15日
    浏览(53)
  • 习题练习 C语言(暑期)

    今天为大家分享我暑假期间所练习的一些小题目! 相信大家看完之后都会有所提升的! 加油! 以下不正确的定义语句是( ) A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0}; B: char c2[] = {‘x10’, ‘xa’, ‘8’}; C: char c1[] = {‘1’,‘2’,‘3’,‘4’,‘5’}; D: int y[5+3]={0, 1, 3, 5, 7, 9}; 题目解

    2024年02月10日
    浏览(54)
  • 习题练习 C语言

    首先我们要了解什么是offsetof宏: . 此具有函数形式的宏返回数据结构或联合类型中成员成员的偏移值(以字节为单位)。 . 返回的值是size_t类型的无符号整数值,其字节数位于指定成员与其结构开头之间。 什么意思呢,可以看到下面这张图片: 下面我们来看到这一习题:

    2024年02月14日
    浏览(50)
  • C语言之数组练习题

    第1关:数组插入元素 300 任务要求 参考答案 评论106 任务描述 相关知识 数组 数组元素的表示方法 编程要求 测试说明 任务描述 本关需要你将一个数插入到一组已经排好序的数组并输出。 相关知识 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式

    2024年02月05日
    浏览(54)
  • 【C语言】练习题整理:11

    今天是10道选择题 下面代码段的输出结果是: -12 自右至左的结合方向称为“右结合性”。最典型的右结合 性运算符是赋值运算符。 如x=y=z,由于“=”的右结合性,应先执行y=z,再执行x=(y=z)运算。 C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。 计算顺序是

    2024年02月11日
    浏览(46)
  • C语言/C++练习题

    题目:从键盘输入年份和月份,输出这个月的天数。 【样例输入】2023 1 【样例输出】31 【样例输入】2020 2 【样例输出】29 提示:当输入的月份为2月份时,需要判断该年年份是否为闰年。 判断闰年的条件:年份为4的倍数并且不是100的倍数,或者年份是400的倍数。 ​ 在控制

    2024年02月06日
    浏览(46)
  • <算法学习>动态规划练习题

    本篇文章为初学动态规划时的练习题。参考优质博客学习后根据伪代码描述完成代码。记录一下用于以后复习。 给定一个有n行数字组成的数字三角形. 试设计一个算法, 计算出从三角形的顶至底的一条路径, 使该路径经过的数字和最大. 算法设计: 对于给定的n行数字组成的三角

    2024年01月17日
    浏览(48)
  • Matlab:遗传算法,模拟退火算法练习题

    1、遗传算法 (1) 遗传算法 是一种基于自然选择原理和自然遗传机 制的搜索(寻优)算法,它是模拟自然界中的生命进化机制,在人工系统中实现特定目 标的优化。遗传算法的实质是通过群体搜索技术,根据适者生存的原则逐代进化,最终 得到最优解或准最优解。它必须

    2024年01月21日
    浏览(47)
  • 【C语言】初阶完结练习题

     🎈个人主页:库库的里昂  🎐CSDN新晋作者  🎉欢迎 👍点赞✍评论⭐收藏  ✨收录专栏:C语言初阶  ✨其他专栏:代码小游戏  🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗 【前言】 C语言初阶 知识点已经全部更完,相

    2024年02月14日
    浏览(46)
  • 【c语言】五道经典练习题④

      目录 ①、年月日经过n天后的日期  ②、坐标排序 ③、统计文件中出现某个单词的次数 ④、输出含for的行 ⑤、比较两个文本是否相等 题述: 定义包含年月日表示的日期的结构体,写程序实现计算某年某月某日过n天后的日期是哪年哪月哪日 思路: 1、 这种题因为关于年了

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包