C++ stringOJ练习题

目录

把字符串转换成整数 

反转字符串

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

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

找出字符串中第一个只出现一次的字符 

字符串相加

字符串最后一个单词长度

字符串相乘

反转字符串3

反转字符串2

验证回文串


把字符串转换成整数 

 

通过遍历字符串并逐位转换,处理空格、正负号和整数溢出的情况。最终返回转换后的整数。 

class Solution {
  public:
    int StrToInt(string str) {
        const int len = str.length();
        if (len == 0) return 0;
        int i = 0;
        while (i < len && str[i] == ' ') {
            ++i;    // 排除开头的空格
        }
        if (i == len) return 0;
        if (!isdigit(str[i]) && str[i] != '+' && str[i] != '-') return 0;
        bool neg = str[i] == '-' ? true : false;
        i = isdigit(str[i]) ? i : i + 1;
        long long ans = 0L;

        while (i < len && isdigit(str[i])) {
            ans = ans * 10 + (str[i++] - '0');

            if (!neg && ans > INT_MAX) {
                ans = INT_MAX;
                break;
            }
            if (neg && ans > 1L + INT_MAX) {
                ans = 1L + INT_MAX;
                break;
            }
        }
        if (i != len) return 0; 
        return !neg ? static_cast<int>(ans) : static_cast<int>(-ans);
    }
};

  1. 首先,定义了一个函数 StrToInt,该函数接受一个字符串参数 str,表示要转换的字符串。

  2. 获取字符串的长度,并检查长度是否为0。如果长度为0,则返回0。

  3. 初始化变量 i 为0,用于遍历字符串。

  4. 使用 while 循环跳过字符串开头的空格,将 i 向后移动。

  5. 检查 i 是否已经达到字符串的末尾,如果是,则返回0。

  6. 检查 str[i] 是否为数字、正号或负号。如果不是,则返回0。

  7. 根据 str[i] 的值,确定是否为负数,并将结果存储在布尔变量 neg 中。

  8. 如果 str[i] 不是数字,则将 i 向后移动一位。

  9. 初始化变量 ans 为0,用于存储转换后的整数。

  10. 进入循环,只要 i 小于字符串的长度且 str[i] 是数字,就执行循环体。

  11. 在循环体内,将 ans 乘以10,并加上 str[i] 减去字符 '0' 的结果,以将字符转换为数字。

  12. 检查转换后的整数是否超出了 INT_MAX 的范围。如果超出了,则将 ans 设置为 INT_MAX 或 1L + INT_MAX,具体取决于 neg 的值。

  13. 将 i 向后移动一位。

  14. 循环结束后,检查 i 是否等于字符串的长度。如果不相等,则表示字符串中包含非数字字符,返回0。

  15. 根据 neg 的值,返回转换后的整数,使用 static_cast<int> 进行类型转换。

 

反转字符串

class Solution {
public:
    void reverseString(vector<char>& s) {
        reverse(s.begin(),s.end());
    }
};

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

 

class Solution {
public:
    int firstUniqChar(string s) {
        int count[26]={0};
        for(auto ch:s){
            count[ch-'a']++;
        }
        for(int i=0;i<s.size();i++){
            if(count[s[i]-'a']==1)
                return i;
        }
        return -1;
    }
};

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

 

#include <iostream>
using namespace std;

int main() {
    string str;
    getline(cin,str);
    size_t pos=str.rfind(' ');
    if(pos!=string::npos){
        cout<<str.size()-pos-1<<endl;
    }
    else{
        cout<<str.size()<<endl;
    }
}

找出字符串中第一个只出现一次的字符 

 

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

int main() {
    string a;
    cin>>a;
    int charCount[256]={0};
    for(auto e:a)
    {
        ++charCount[e];
    }
    int s=-1;
    for(auto e:a)
    {
        if(charCount[e]==1)
        {
            cout<<e;
            s=1;
            break;
        }
    }
    if(s==-1)
        cout<<s;
}
  1. 首先,定义了一个字符串变量 a,用于接收用户的输入。

  2. 创建一个大小为256的整型数组 charCount,用于记录每个字符在字符串中出现的次数。初始时,所有元素都被初始化为0。

  3. 使用 for 循环遍历字符串 a 中的每个字符。

  4. 在循环中,将当前字符 e 对应的 charCount 数组元素加1,以统计字符出现的次数。

  5. 初始化变量 s 为-1,用于标记是否找到了不重复的字符。

  6. 使用另一个 for 循环遍历字符串 a 中的每个字符。

  7. 在循环中,检查当前字符 e 在 charCount 数组中的值。如果值为1,表示该字符只出现了一次,即为第一个不重复的字符。

  8. 输出该字符,并将变量 s 设置为1,表示已找到不重复字符。

  9. 如果循环结束后 s 仍为-1,表示没有找到不重复的字符。

  10. 输出变量 s 的值,即-1。

 

字符串相加

 

class Solution {
public:
    string addStrings(string num1, string num2) {
        int end1=num1.size()-1;
        int end2=num2.size()-1;
        int next=0;
        string str;
        str.reserve(num1.size()>num2.size()?num1.size()+1:num2.size()+1);
        while(end1>=0||end2>=0){
            int val1=end1>=0?num1[end1]-'0':0;
            int val2=end2>=0?num2[end2]-'0':0;
            int ret =val1+val2+next;
            next=ret/10;
            ret=ret%10;
            str+='0'+ret;
            --end1,--end2;
        }
        if(next==1)
            str+='1';
        reverse(str.begin(),str.end());
        return str;
    }
};
  1. 首先,定义了一个函数 addStrings,该函数接受两个字符串参数 num1 和 num2,表示要相加的两个数字。

  2. 初始化变量 end1 和 end2 分别为 num1 和 num2 的最后一个字符的索引。

  3. 初始化变量 next 为0,用于记录进位。

  4. 创建一个空字符串 str,用于存储相加的结果。

  5. 根据两个字符串的长度,预先分配 str 的容量,以避免不必要的内存重新分配。

  6. 进入循环,只要 end1 或 end2 中至少有一个大于等于0,就执行循环体。

  7. 在循环体内,首先获取 num1 和 num2 当前索引位置的字符,并将其转换为对应的数字值。如果已经超出字符串的范围,则将其视为0。

  8. 将 val1val2 和 next 相加,得到 ret,并更新 next 为 ret 除以10的商,更新 ret 为 ret 除以10的余数。

  9. 将 ret 转换为字符,并将其添加到 str 的末尾。

  10. 更新 end1 和 end2,向前移动一位。

  11. 循环结束后,如果 next 为1,说明最高位有进位,将字符 '1' 添加到 str 的末尾。

  12. 将 str 反转,得到正确的相加结果。

  13. 返回 str

 

字符串最后一个单词长度

 

 首先介绍一下接下来会用到的读取字符串的函数getline.

getline 是 C++ 标准库中的一个函数,用于从输入流中读取一行字符串。它有以下几个特点:

  1. 读取一行字符串getline 函数会读取输入流中的一行字符串,直到遇到换行符('\n') 或者文件结束符(EOF)。它将读取的字符串存储到指定的变量中。

  2. 处理空格字符:与 cin 不同,getline 函数会将空格字符(包括空格、制表符等)视为普通字符,而不是作为分隔符。这意味着 getline 可以读取包含空格的字符串,而不会在空格处停止读取。

  3. 保留换行符getline 函数会将换行符('\n') 从输入流中读取并存储在字符串中,即使它是一行的结尾。这与 cin 不同,cin 会将换行符视为分隔符并从输入流中丢弃。

  4. 指定分隔符:除了默认的换行符作为分隔符外,getline 函数还可以接受一个可选的分隔符参数,用于指定其他字符作为行的结束标志。例如,可以使用 getline(cin, str, ',') 来读取以逗号分隔的字符串。

#include <iostream>
using namespace std;

int main() {
    string str;
    getline(cin,str);
    size_t pos=str.rfind(' ');
    if(pos!=string::npos){
        cout<<str.size()-pos-1<<endl;
    }
    else{
        cout<<str.size()<<endl;
    }
}

字符串相乘

 

 

class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1=="0"||num2=="0")
            return "0";
        int n1=num1.size(),n2=num2.size();
        string result(n1+n2,'0');
       for (int i = n1 - 1; i >= 0; i--) {
            for (int j = n2 - 1; j >= 0; j--) {
                int product = (num1[i] - '0') * (num2[j] - '0') + (result[i + j + 1] - '0');
                result[i + j + 1] = product % 10 + '0';
                result[i + j] += product / 10;
            }
        }

        size_t startpos = result.find_first_not_of("0");
        if (string::npos != startpos) {
            return result.substr(startpos);
        }
        return "0";
    }
};

反转字符串3

 

class Solution {
public:
    string reverseWords(string s) {
        int pos=s.find(' ');
        int start=0;
        while(pos!=string::npos)
        {
            reverse(s.begin()+start,s.begin()+pos);
            start=pos+1;
            pos=s.find(' ',pos+1); 
        }
        reverse(s.begin()+start,s.end());
        return s;
    }
};

反转字符串2

 

class Solution {
public:
    string reverseStr(string s, int k) {
        auto start = s.begin();
        while (start < s.end()) {
            if (start + k < s.end()) {
                reverse(start, start + k);
            } else {
                reverse(start, s.end());
            }
            start += 2 * k;
        }
        return s;
    }
};

验证回文串

 

class Solution {
public:
    bool isPalindrome(string s) {
        string judge;
        for(char c:s)
        {
            if(isalnum(c))
                judge+=tolower(c);
        }
        int left=0;
        int right=judge.size()-1;
        while(left<right)
        {
            if(judge[left]!=judge[right])
            {
                return false;
            }
            ++left;--right;
        }
        return true;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

漏洞复现-浙大恩特客户资源管理系统CustomerAction.entphone;.js 接口任意文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

【开发工具】最新VMWare无法识别USB设备,驱动错误,未知错误【2023.12.15】

解决方案1&#xff1a;在这里改下连接方式 多试试 解决方案2 控制面板卸载程序&#xff0c;进行VMWare的修复 解决方案3 对于Windows7系统&#xff0c;切换解决方案1的usb类型为3.1&#xff0c;并下载这个intel的驱动包到虚拟机里 https://www.intel.com/content/www/us/en/do…

毅速:金属3D打印引领制造业进入新时代

随着科技的飞速发展&#xff0c;3D打印技术逐渐渗透到各个领域&#xff0c;为制造业带来了革命性的变革。其中&#xff0c;金属3D打印技术以其独特的优势&#xff0c;正逐渐成为制造业的新宠。 金属3D打印&#xff0c;也称为金属粉末烧结&#xff0c;是一种利用高能激光束将金属…

【JUC】三十、什么是AQS

文章目录 0、背景1、AQS介绍2、AQS核心概念3、AQS是JUC的基石4、锁和同步器的关系5、AQS的作用6、state和CLH队列6、AQS的内部类Node 0、背景 一段常见的代码&#xff1a; Lock lock new ReentrantLock(); lock.lock; try{//do Something } finally{lock.unlock(); }简单的一…

10分钟利用宝塔面板在阿里云服务器部署个人网页

目录 1、申请阿里云服务器 2、更换镜像&#xff08;可选&#xff09; 3、远程链接阿里云服务器安装宝塔面板 4、开放安全组 5、宝塔面板上传项目文件 1、申请阿里云服务器 购买链接->阿里云服务器购买 个人购买的就是这款&#xff0c;比较经济合算&#xff0c;而且2核…

HTTP 404错误:页面未找到,如何解决

在互联网上浏览时&#xff0c;偶尔会遇到“HTTP 404错误&#xff1a;页面未找到”的提示。这通常意味着用户尝试访问的网页不存在或无法找到。本文将探讨HTTP 404错误的原因以及如何解决这个问题。 一、HTTP 404错误的原因 HTTP 404错误可能是由多种原因引起的。以下是一些常…

线程安全集合类

文章目录 1. ConcurrentHashMap2. LinkedBlockingQueue 阻塞队列3. ConcurrentLinkedQueue4. CopyOnWriteArrayList JDK1.7 hashmap采用数组加链表头插的方式&#xff0c;在扩容时会出现循环死链问题&#xff0c;A->B->C扩容后C->B->A AB BA出现循环死链。 1. Conc…

《opencv实用探索·十九》光流法检测运动目标

前言 光流法&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;用于估计图像中相邻帧之间的像素位移或运动。它是一种用于追踪图像中物体运动的技术&#xff0c;可以在视频中检测并测量物体的运动轨迹。 光流的直观理解&#xff1a; 光流是一个视频中两…

ubuntu-c++-可执行模块-动态链接库-链接库搜索-基础知识

文章目录 1.动态链接库简介2.动态库搜索路径3.运行时链接及搜索顺序4.查看可运行模块的链接库5.总结 1.动态链接库简介 动态库又叫动态链接库&#xff0c;是程序运行的时候加载的库&#xff0c;当动态链接库正确安装后&#xff0c;所有的程序都可以使用动态库来运行程序。动态…

upload-labs笔记

简介 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共21关&#xff0c;每一关都包含着不同上传方式。 文件上传漏洞是指&#xff1a; Web 服务器允许用户将文件上传至其…

[Unity]关于Unity接入Appsflyer并且打点支付

首先需要去官方下载Appsflyer的UnityPackage 链接在这afPackage 然后导入 导入完成 引入此段代码 using AppsFlyerSDK; using System.Collections; using System.Collections.Generic; using UnityEngine;public class AppflysManager : MonoBehaviour {public static App…

JMeter逻辑控制器

JMeter逻辑控制器 一、IF控制器1、作用2、步骤 二、循环控制器1、作用2、步骤3、线程组和循环控制器的区别&#xff1f; 三、ForEach控制器1、作用2、步骤 一、IF控制器 1、作用 **控制下面的测试元素是否执行**2、步骤 添加线程组用户定义的变量添加if控制器&#xff0c;判断…

VBA_MF系列技术资料1-242

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

C++之模板

目录 泛型编程 模板 函数模板 函数模板的实例化 隐式实例化 显示实例化 类模板 我们知道STL&#xff08;标准模板库&#xff09;是C学习的精华所在&#xff0c;在学习STL之前我们得先学习一个新的知识点-------模板。那么模板究竟是什么呢&#xff1f;围绕着这个问题&a…

java全栈体系结构-架构师之路(持续更新中)

Java 全栈体系结构 数据结构与算法实战&#xff08;已更&#xff09;微服务解决方案数据结构模型(openresty/tengine)实战高并发JVM虚拟机实战性能调优并发编程实战微服务框架源码解读集合框架源码解读分布式架构解决方案分布式消息中间件原理设计模式JavaWebJavaSE新零售电商项…

使用广播星历进行 GPS 卫星位置的计算

目录 1.计算卫星运动的平均角速度 n 2.计算观测瞬间卫星的近地点角 3.计算偏近点角 4.计算真近点角 f 5.计算升交角距 6.计算摄动改正项 7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置 9.计算观测瞬间升交点的经度 L 10.计算卫星在瞬时地球坐标系中的位置 11.…

Matlab simulink PLL学习笔记

本文学习内容&#xff1a;【官方】2022小迈步之 MATLAB助力芯片设计系列&#xff08;一&#xff09;&#xff1a;电路仿真与模数混合设计基础_哔哩哔哩_bilibili 所用规格书&#xff1a;https://store.skyworksinc.com/datasheets/skyworks/sky73134_11.pdf 本文所用simulink…

【无标题】创新蓄势!安全狗多项技术获颁专利

近日&#xff0c;安全狗《一种网络安全监测方法、终端设备及存储介质》、《一种恶意进程风险等级评估方法、终端设备及存储介质》等多项专利顺利通过了国家知识产权局的相关审核认证&#xff0c;并获得了发明专利证书。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a…

Mistral AI发布开放权重的高质量SMoE模型Mixtral 8x7B

&#x1f989; AI新闻 &#x1f680; 开源MoE大模型震惊开源社区 摘要&#xff1a;上周末&#xff0c;Mistral开源了一款震惊开源社区的MoE大模型。MoE是一种神经网络架构设计&#xff0c;能够提升大语言模型的性能。通过使用MoE&#xff0c;每个输入token都可以动态路由到专…

【AutoDL】使用云服务器跑深度学习代码

一、AutoDL租用服务器 1.选用服务器 1.算力市场 租用服务器&#xff0c;选择自己心仪的服务器 2.镜像 可以选择一些基础的镜像&#xff0c;社区镜像里是git上有的环境。 3.上传文件 在文件存储中&#xff0c;选择上传的区&#xff0c;在右边点击上传&#xff0c;选择自己的文…