【C++练习】string:字符串题型训练(5道编程题)

news2025/1/9 2:12:55

【C++练习】string:字符串题型训练

  • Ⅰ.字符串中的第一个唯一字符
  • Ⅱ.字符串最后一个单词的长度
  • Ⅲ.把字符串转换成整数
  • Ⅳ.字符串相加
  • Ⅴ.反转字符串

Ⅰ.字符串中的第一个唯一字符

在这里插入图片描述

解题思路:
第一种方法:
两次遍历
1.第一次遍历,将每个字符出现的次数记录下来
2.第二次遍历,找到只出现一次的字符

class Solution {
public:
    int firstUniqChar(string s) 
    {

     //记录每个字符出现的个数
     //每个字符对应着ASCII码值
     int cout[256]={0};
     for(int i=0;i<s.size();i++)
     {
         cout[s[i]]+=1;
     }
     //找到出现一次的字符返回下标
      for(int i=0;i<s.size();i++)
     {
         if(cout[s[i]]==1)
         return i;
     }
     return -1; 
    }
};

第二种方法:
正序查找和反序查找,如果下标相同则说明只有一个
1.对字符串的每个字符分别进行正序查找和反序查找。
2.如果正序和反序找的下标一样,则说明只有一个。

class Solution {
public:
    int firstUniqChar(string s) 
    {

     //记录每个字符出现的个数
     //每个字符对应着ASCII码值
     int cout[256]={0};
     for(int i=0;i<s.size();i++)
     {
         cout[s[i]]+=1;
     }
     //找到出现一次的字符返回下标
      for(int i=0;i<s.size();i++)
     {
         if(cout[s[i]]==1)
         return i;
     }
     return -1; 
    }
};

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

在这里插入图片描述

解题思路:
1.最后一个单词,空格将两个单词分割开。所以最后一个单词前面就是空格。
2.可以利用查找空格字符,来获取这个位置,然后用总长度减去该位置就是最后一个字符的长度。
3.要注意的是cin输入的特点:读取时遇到空格或换行就会结束
4.所以这里不能使用cin或scanf,要是有getline。
getline的作业就是可以获取一行字符串,读取到空格也不结束,只有遇到换行才结束。

#include <iostream>
using namespace std;
#include <string>

int main()
{
    string s1;
    while(getline(cin,s1))
    {
       size_t pos=s1.rfind(' ');
       cout<< s1.size()-(pos+1)<<endl;
    }
    return 0;
}

Ⅲ.把字符串转换成整数

在这里插入图片描述

解题思路:
1.异常情况分析
2.正负处理
3.溢出处理
异常和正负情况如何处理呢?
首先要分析第一位是什么:空格?正号?负号,还是其他字母?还是正常数字字符?这些情况都分析一下。
当首位为空格时,可以直接跳过,不需要再分析后面的了。
当首位为正号时,定义一个标志来默认是1。
当首位是负号时,将表示改成-1。
当首位是正常数字字符,就可以把它转化为数字。转化方法:ret=ret*10+‘数字字符’-‘0’.因为每次要将上一个数字往左移动,也就是每次都要给上次的数字乘上10.
其他情况就直接返回0。
最后就是考虑溢出情况了。

class Solution {
public:
    int StrToInt(string str) 
    {
        //1异常类型讨论
        //2.正负处理
        //3.溢出处理
      
      int flag=1;
      long long ret=0;
      for(int i=0;i<str.size();i++)
      {
        if(str[i]==' ')
        {
            continue;
        }
        else if(str[i]=='-')
        {
            flag=-1;
        }
        else if(str[i]=='+')
        {
            ;
        }
        else if((str[i]-'0')>=0&&(str[i]-'0')<=9)
        {
            ret=ret*10+(str[i]-'0');
            if((flag>0 && ret>0x7fffffff) || (flag<0 && ret>0x80000000))
          {
              return 0;
          }
          
        }
        else 
        {
          return 0;
        }
      }
    
        return flag*ret;
    }
  
};

Ⅳ.字符串相加

在这里插入图片描述

解题思路:
1.字符相加,从每个字符的最后一位开始相加,因为数字相加就是从个位先加然后十位然后百位。
2.要将每一位的字符先转化为数字才可以相加。
3.要满足进位。满十进一。
4.当对应位子上相加一个字符没有时,默认为0。

在这里插入图片描述
还有一种情况要讨论,当两个字符串都只有一个字符时。这种情况需要特别说明一下,因为不说明进位会没有加上。
5.最后需要将该字符串逆转,因为相加的时候,从尾部相加,然后尾插到新字符上。最后的结果是反着的。

class Solution {
public:
    string addStrings(string num1, string num2) {
     int end1=num1.size()-1,end2=num2.size()-1;
     int carry=0;
     string strRet;
     //从最后一位开始往前加
     while(end1>=0||end2>=0)
     {
         //1.首先将每一位上的字符转化为数字
         //2.如果两个字符相同位子上一个没有了,默认为0.
        int val1=end1>=0?(num1[end1]-'0'):0;
        int val2=end2>=0?(num2[end2]-'0'):0;

        int ret=val1+val2+carry;
        carry=ret/10;//carry表示进位
        ret%=10;//ret表示进位完该位子的数值

       strRet+=ret+'0';//将每个位子上的字符相加后尾插到新的空字符上。
      
       --end1;
       --end2;
     }
     if(carry==1)
     {
         strRet+='1';
     }
     reverse(strRet.begin(),strRet.end());
     return strRet;
    }
};

Ⅴ.反转字符串

在这里插入图片描述

解决思路:
1.在原数组上修改,那么只要左边和右边交换即可。
2.结束条件就是左下标要小于等于右下标。

class Solution {
public:
    void reverseString(vector<char>& s)
    {
        int right=s.size()-1;
        int left=0;
        while(left<=right)
        {
            char temp=s[right];
            s[right]=s[left];
            s[left]=temp;
            ++left;
            --right;
        }

    }
};

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

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

相关文章

【HTTP 协议2】如何构造 HTTP 请求

文章目录 前言一、地址栏输入二、HTML 特殊标签三、form 表单四、ajax总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 &#x1f4d7; Java数据结…

【Echarts】配置项归纳

【Echarts】配置项归纳 一、title二、legend三、grid四、xAxis/yAxis五、polar六、radiusAxis七、angleAxis八、radar九、dataZoom1. 内置型数据区域缩放组件2. 滑动条型数据区域缩放组件3. 框选型数据区域缩放组件 十、tooltip十一、axisPointer十二、toolbox十三、brush十四、…

不定长图文模型训练

文章目录 生成数据集模型选择计算均值和标准差训练代码测试集测试 生成数据集 import os import random from PIL import Image, ImageDraw, ImageFont, ImageFilter from io import BytesIO import timedef main():_first_num random.randint(1, 1000)_code_style [加, 减,…

【uniapp开发小程序】实现粘贴一段文字后,自动识别到姓名/手机号/收货地址

一、需求 在uni-app中开发小程序&#xff0c;实现粘贴一段文字后自动识别到手机号&#xff0c;并将手机号前面的内容作为姓名&#xff0c;手机号后面的内容作为收货地址&#xff0c;并去除其中的特殊字符和前缀标识。 实现效果&#xff1a; 二、实现方式&#xff1a; <…

【vue】vue.js中引入组件

目录 ⭐️一、点击按钮1弹出弹窗⭐️二、vue.js引入组件具体步骤1、创建自定义组件的文件夹&#xff08;以弹窗组件为例&#xff09;2、在index.vue中引入keyProductsTip.vue模块3、在index.vue中引入组件4、在index.vue中使用组件&#xff0c;点击按钮打开弹窗5、index.vue中的…

高级web前端开发工程师的主要职责模板(合集)

高级web前端开发工程师的主要职责模板1 职责&#xff1a; 1、web端页面的制作、开发和优化; 2、编写静态和动态页面和交互、特效等功能的脚本程序; 3、开发基于HTML5技术的可灵活定制、可扩展的前端UI组件; 4、优化前端架构&#xff0c;提高系统的灵活性和可扩展性; 5、开…

【AUTOSAR】BMS开发实际项目讲解(二十六)----电池管理系统低压上下电功能

低压上下电功能 关联的系统需求 Sys_Req_3101、Sys_Req_3102、Sys_Req_3103、Sys_Req_3104; 功能实现描述 低压上电管理 ID Description ASIL Ref. LVM-101 当系统检测到如下任一信号有效时&#xff1a; 整车CAN、ACC、IGN、CC、CP唤醒、一路预留硬线唤醒系统应…

Java安全——存取控制器

Java安全 存取控制器 Java安全中的存取控制器是一种技术&#xff0c;用于控制访问应用程序中的资源。它的基本思想是允许或拒绝特定用户对系统资源的访问。存取控制器包括四个关键部分: 主体(subject), 权限(permission), 对象(object)和存取控制策略(access control policy)。…

【vue3】学生管理案例

此案例可以分为4个部分&#xff1a; 渲染学生列表新增学生删除学生搜索学生 涉及的知识点主要为v-model双向绑定数据。 页面&#xff1a; <div id"main"><table><tr><td>学号</td><td>姓名</td><td>新增时间<…

121.【ElasticSearch伪京东搜索】

模仿京东搜索 (一)、搭建环境0.启动ElasticSearch和head和kblian(1).启动EslaticSearch (9200)(2).启动Es-head (9101)(3).启动 Kibana (5602) 1.项目依赖2.启动测试 (二)、爬虫1.数据从哪里获取2.导入爬虫的依赖3.编写爬虫工具类(1).实体类(2).工具类编写 4.导入配置类 (三)、…

Selenium系列(四) - 详细解读鼠标操作

引入HTML页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>测试笔记</title> </head> <body><a>用户名:</a> <input id"username" class"userna…

航空枢纽联通亚欧,开放合作互利共赢 —乌鲁木齐国际航空枢纽建设论坛将于7月6日召开

为创新开放型经济体制&#xff0c;加快建设对外开放大通道&#xff0c;更好利用国际国内两个市场、两种资源&#xff0c;积极服务和融入双循环新发展格局&#xff0c;促进经济高质量发展&#xff0c;2023年7月6日-7日&#xff0c;以“航空枢纽联通亚欧&#xff0c;开放合作互利…

基于matlab使用单眼摄像机图像数据构建室内环境地图并估计摄像机的轨迹(附源码)

一、前言 视觉同步定位和映射 &#xff08;vSLAM&#xff09; 是指计算摄像机相对于周围环境的位置和方向&#xff0c;同时映射环境的过程。该过程仅使用来自相机的视觉输入。vSLAM 的应用包括增强现实、机器人和自动驾驶。 此示例演示如何处理来自单眼摄像机的图像数据&…

从小白到大神之路之学习运维第50天---第三阶段----MMM高可用集群数据库的安装部署

第三阶段基础 时 间&#xff1a;2023年6月30日 参加人&#xff1a;全班人员 内 容&#xff1a; Mysql---MMM高可用集群架构 目录 一、MMM介绍 二、MMM工作原理 三、MMM安装部署 环境配置&#xff1a;&#xff08;所有主机配置&#xff09; 1、主机信息 ​编辑 2、…

探索无限可能的教育新领域,景联文教育GPT题库开启智慧教育新时代!

随着人工智能技术的快速发展&#xff0c;教育领域也将迎来一场革命性的变革。景联文科技是AI基础数据行业的头部企业&#xff0c;近期推出了一款高质量教育GPT题库。 景联文科技高质量教育GPT题库采用了先进的自然语言处理技术和深度学习算法&#xff0c;可以实现对各类题目的智…

一个输入网址就可显示网站安全性及网站主要内容的含GUI的Python小程序

文章目录 1.一些杂七杂八的引入2.实现2.1 显示网站安全性2.2 安装所需python包2.2.1 requests包2.2.1 beautifulsoup包 3.源码展示4.效果展示 1.一些杂七杂八的引入 上次发了一个类似爬虫&#xff0c;可以自动下载网页图片的python小程序&#xff08;详见一个自动下载网页图片…

【Web工具】3D 旋转中各数据格式之间的转换

1 Rotation Master — Link GitHub: Link 2 3D Rotation Converter — Link GitHub: Link 3 Quaternions — Link 4 Rotation Conversion Tool — Link 这是个人博客网站&#xff0c;其中可能有你需要的知识: Link

Prometheus实现自定义指标监控

1、Prometheus实现自定义指标监控 前面我们已经通过 PrometheusGrafana 实现了监控&#xff0c;可以在 Grafana 上看到对应的 SpringBoot 应用信息了&#xff0c; 通过这些信息我们可以对 SpringBoot 应用有更全面的监控。 但是如果我们需要对一些业务指标做监控&#xff0c;…

老文章可以删了!!!。2023年最新IDEA中 Java程序 | Java+Kotlin混合开发的程序如何打包成jar包和exe文件(gradle版本)

文章内容&#xff1a; 一. JAVA | JAVA和Kotlin混开开发的程序打包成jar方法 1.1 方法一 &#xff1a;IDEA中手动打包 1.2 方法二 &#xff1a;build.gradle中配置后编译时打包 二. JAVA | JAVA和Kotlin混合开发的程序打包成exe的方法 一. JAVA | JAVA和Kotlin混开开发的程序…

使用 Jetpack Compose 实现 ViewPager2

在此博客中&#xff0c;我们将介绍如何在Jetpack Compose中实现ViewPager2的功能。我们将使用Accompanist库中的Pager库&#xff0c;这是由Google开发的一个用于Jetpack Compose的库。 首先&#xff0c;需要将Pager库添加到你的项目中&#xff1a; implementation androidx.co…