【C++初阶】值得一刷的字符串string相关oj题

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


目录

  • 一、把字符串转化为整数
  • 二、字符串相加
  • 三、反转字符串
  • 四、字符串中的第一个唯一字符
  • 五、字符串最后一个单词的长度
  • 六、验证回文串
  • 七、反转字符串 II
  • 八、 反转字符串中的单词 III
  • 九、高精度乘以高精度

一、把字符串转化为整数

题目链接:点击跳转

在这里插入图片描述

class Solution {
public:
    int StrToInt(string str) 
    {
        // 特判集合可能为空集的情况
        if (str.empty()) return 0;

        int flag = 1; // 用来判断这个数是正数还是负数
        int i = 0; // 遍历字符串
        
        if (str[i] == '-')
        {
            flag = -1;
            i++;
        }
        else if (str[i] == '+')
        {
            i++;
        }

        int ans = 0; // 存储数字
        for (; i < str.size(); i++)
        {
            if (str[i] < '0' || str[i] > '9')
            {
                return 0;
            }
            ans = ans * 10 + (str[i] - '0');
        }
        return ans * flag;
    }
};

二、字符串相加

题目链接:点击跳转

在这里插入图片描述

class Solution {
public:
	// 解决思路:模拟
    string addStrings(string num1, string num2) {
        //  将字符串翻转(原因:进位头插很头疼)
        reverse(num1.begin(), num1.end());
        reverse(num2.begin(), num2.end());

        string ans; // 答案
        int t = 0; // 进位
        for (int i = 0; i < num1.size() || i < num2.size() || t; i++)
        {
            if (i < num1.size()) t +=  num1[i] - '0';
            if (i < num2.size()) t +=  num2[i] - '0';
            ans.push_back(t % 10 + '0');
            t /= 10;
        }
        // 最后将答案翻转
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

三、反转字符串

题目链接:点击跳转

在这里插入图片描述

class Solution {
public:
    // 解决思路:双指针算法
    void reverseString(vector<char>& s) 
    {
        vector<char>::iterator left = s.begin();
        vector<char>::iterator right = s.end() - 1;
        while (left < right)
        {
            char t = *left;
            *left = *right;
            *right = t;
            left++;
            right--;
        }

        for (auto& e : s)
        {
            cout << e;
        }
    }
};

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

题目链接:点击跳转

  • 解题思路1:哈希表
class Solution {
public:
    int firstUniqChar(string s) 
    {
        unordered_map<char, int> heap;
        for (int i = 0; i < s.size(); i++)
        {
            heap[s[i]]++;
        }
        for (int i = 0; i < s.size(); i++)
        {
            if (heap[s[i]] == 1)
            {
                return i;
            }
        }
        return -1;
    }
};
  • 解题思路2:用数组模拟哈希表
class Solution {
public:
    int firstUniqChar(string s) 
    {
        int heap[26] = {0};
        for (int i = 0; i < s.size(); i++)
        {
            heap[s[i] - 'a']++;
        }
        for (int i = 0; i < s.size(); i++)
        {
            if (heap[s[i] - 'a'] == 1)
            {
                return i;
            }
        }
        return -1;
    }
};

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

题目链接:点击跳转

在这里插入图片描述

  • 解题思路1:从最后一个字符开始遍历,直到遇到空格停止
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    getline(cin, s);
    
    int ans = 0;
    for (int i = s.size() - 1; i >= 0; i--)
    {
        if (s[i] != ' ') ++ans;
        else break;
    }
    cout << ans << endl;
    return 0;
}
  • 解题思路2:巧用函数(不推荐,因为函数根本记不住hh)
#include <iostream>
using namespace std;

int main()
{
    string s;
    getline(cin, s);
    
    // rfind:从后往前查找目标
    int space_of_lastpos = s.rfind(' ');
    int last_pos = s.size() - 1;
    int res = last_pos -  space_of_lastpos;
    
    cout << res << endl;
    
    return 0;
}

六、验证回文串

题目链接:点击跳转

在这里插入图片描述

class Solution {
public:
    bool isPalindrome(string s) {
        // 将大写字符转换为小写字符
        string str;
        for (auto& e : s)
        {
            if (e >= 'A' && e <= 'Z')
            {
                str += tolower(e);
            }
            // 移除所有非字母数字字符之后
            // 意思是保留字母 + 数字
            else if ((e >= 'a' && e <= 'z') || (e >= '0' && e <= '9'))
            {
                str += e;
            }
        }
        // 判断回文串
        if (str.empty()) return true; // 特殊情况

        string str2(str);
        reverse(str2.begin(), str2.end());

        if (str == str2) return true;
        else return false;
    }
};

七、反转字符串 II

题目链接:点击跳转

在这里插入图片描述

class Solution {
public:
	// 思路:将题目描述转化为代码即可
    string reverseStr(string s, int k) 
    {
        // 间隔2k
        for (int i = 0; i < s.size(); i += (2 * k)) 
        {
            // 1. 每隔 2k 个字符的前 k 个字符进行反转
            // 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
            if (s.size() - i >= k)
            {
                reverse(s.begin() + i, s.begin() + i + k );
                continue;
            }
            // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
            else
            {
                reverse(s.begin() + i, s.begin() + s.size());
            }
            
        }
        return s;
    }
        
};

八、 反转字符串中的单词 III

题目链接:点击跳转

在这里插入图片描述

class Solution {
public:
	// 解题思路:双指针算法
    string reverseWords(string s) 
    {
        for (int i = 0; i < s.size(); i++)
        {
            int j = i;
            while (j < s.size() && s[j] != ' ') j++;
            if (s[j] == '\0')
            {
                reverse(s.begin() + i, s.begin() + s.size());
                break;
            }
            reverse(s.begin() + i, s.begin() + j);
            i = j;
        }
        return s;
    }
};

九、高精度乘以高精度

题目链接:点击跳转

在这里插入图片描述

class Solution {
public:
    string multiply(string num1, string num2) 
    {
        vector<int> A,B;
        //  到存
        int n = num1.size(), m = num2.size();
        for (int i = n - 1;i >= 0; i--)
            A.push_back(num1[i] - '0');
        for (int i = m - 1;i >= 0;i--)
            B.push_back(num2[i] - '0');

        vector<int> c(n + m);

        for(int i = 0;i < A.size();i++)
        {
            for(int j = 0;j < B.size();j++)
            {
                c[i + j] += A[i] * B[j];
                // 处理进位
                if (c[i + j] >= 10)
                {
                    c[i + j + 1] += c[i + j] / 10;
                }
                c[i + j] %= 10;
            }
        }

        while(c.size() > 1 && c.back() == 0)
            c.pop_back();
        
        reverse(c.begin(), c.end());

        string ans;
        for (size_t i = 0; i < c.size(); i++)
        {
            ans += c[i] + '0';
        }
        return ans;
    }
};

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

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

相关文章

Visual Studio+C#实现信道与信息率失真函数

1. 要求 设计一款信道与信息率失真函数计算系统&#xff0c;要求如下&#xff1a; 系统能够通过输入的转移概率矩阵计算对称以及非对称离散无记忆信道的信道容量系统能够通过输入的概率分布以及失真矩阵来计算与信息率失真函数有关的相关参数&#xff0c;例如Dmin&#xff0c…

【初始RabbitMQ】发布订阅的实现

发布确认原理 生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c;所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker 就会发送一个确认给生产者(包含消息的…

Java并发之死锁详解

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ &#x1f440;&#x1f440;&#x1f440; 个人博客&#xff1a;小奥的博客 &#x1f44d;&#x1f44d;&#x1f44d;&#xff1a;个人CSDN ⭐️⭐️⭐️&#xff1a;传送门 &#x1f379; 本人24应届生一枚&#xff0c;技术和水平有限&am…

拿捏c语言指针(中)

前言 书接上回 拿捏c语言指针&#xff08;上&#xff09; 此篇主要讲解的是指针与数组之间的爱恨情仇&#xff0c;跟着我的脚步一起来看看吧~ 创造不易&#xff0c;可以帮忙点点赞吗 如有差错&#xff0c;欢迎指出 理解数组名 数组名是首元素地址 例外 1.sizeof&#xff0…

【SQL注入】小白手把手入门SQL注入1-数据库基础

前言 本文以SQL注入为核心&#xff0c;讲解MySQL数据库的基本知识&#xff0c;和在SQL注入过程中可能会用到的部分重要语法。 什么是数据库 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集…

【电路笔记】-感抗

感抗 文章目录 感抗1、概述2、感抗示例13、通过 LR 串联电路的交流电源4、感抗示例25、交流电感器的功率三角形线圈的感抗取决于所施加电压的频率,因为电抗与频率成正比。 1、概述 感抗是电感线圈的一种特性,它抵抗通过它的交流电 (AC) 的变化,类似于电阻中对抗直流电 (DC)…

LCR 127. 跳跃训练【简单】

LCR 127. 跳跃训练 题目描述&#xff1a; 今天的有氧运动训练内容是在一个长条形的平台上跳跃。平台有 num 个小格子&#xff0c;每次可以选择跳 一个格子 或者 两个格子。请返回在训练过程中&#xff0c;学员们共有多少种不同的跳跃方式。 结果可能过大&#xff0c;因此结果…

OpenAI超级视频模型Sora技术报告解读,虚拟世界涌现了

昨天白天&#xff0c;「现实不存在了」开始全网刷屏。 「我们这么快就步入下一个时代了&#xff1f;Sora简直太炸裂了」。 「这就是电影制作的未来」&#xff01; 谷歌的Gemini Pro 1.5还没出几个小时的风头&#xff0c;天一亮&#xff0c;全世界的聚光灯就集中在了OpenAI的So…

php 函数(方法)、日期函数、static关键字

php 函数、日期函数 1. php函数2. 日期函数3. static 1. php函数 函数是一段可重复使用的代码块&#xff0c;可以将一系列操作封装起来&#xff0c;使代码更加模块化、可维护和可重用&#xff0c;来大大节省我们的开发时间和代码量&#xff0c;提高编程效率。 <?php// …

基于SpringBoot+WebSocket+Spring Task的前后端分离外卖项目-订单管理(十七)

订单管理 1. Spring Task1.1 介绍1.2 cron表达式1.3 入门案例1.3.1 Spring Task使用步骤1.3.2 代码开发1.3.3 功能测试 2.订单状态定时处理2.1 需求分析2.2 代码开发2.3 功能测试 3. WebSocket3.1 介绍3.2 入门案例3.2.1 案例分析3.2.2 代码开发3.2.3 功能测试 4. 来单提醒4.1 …

167基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的程序

基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的程序&#xff0c;可显示承载能力、压强、刚度及温升等图谱.程序已调通&#xff0c;可直接运行。 167 显示承载能力、压强、刚度及温升 (xiaohongshu.com)https://www.xiaohongshu.com/explore/65d212b200000000…

【uCore 操作系统】1. 应用程序与基本执行环境

文章目录 【 1. 代码框架简述 】1.1 OS 是怎么跑起来的&#xff1f;1.1.1 qemu 的作用1.1.2 rustsbi.bin 的作用 1.2 qemu 是怎么跑起来的&#xff1f;1.3 OS 文件夹1.3.1 kernel.ld1.3.2 entry.S1.3.3 main.c1.3.4 sbi.c 1.4 bootloader 文件夹 【 2. makefile 和 qemu 】2.1 …

测试架构师必备技能 —— Nginx安装部署实战

Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的免费开源Web和 反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。在高并发访问的情况下&#xff0c;Nginx是Apache服务器不错的替代品。官网数据显示每秒TPS高达50W左右。本文…

基于51单片机的智能火灾报警系统的设计与实现

摘要:电子科技和城市建设的快速发展,电子设备产品使用频率和城市高层、地下以及大型综合性建筑修建的日益增多,在享受便捷生活的同时火灾隐患大大增加,一旦发生火灾,将带来严重危害。为预防火灾的发生,本文设计开发一种新型便捷智能火灾报警系统,由MCS-51 单片机、烟雾传…

C++学习—单例模式

目录 ​编辑 一&#xff0c;单例模式介绍 二&#xff0c;单例模式下的两种模式 1&#xff0c;饿汉模式 2&#xff0c;懒汉模式 一&#xff0c;单例模式介绍 单例&#xff1a;在全局只有一份实例。 单例模式是编程的经典模式之一。 二&#xff0c;单例模式下的两种模式 1&am…

面试:百度一面,吓尿了

公众号&#xff1a;程序员白特&#xff0c;可加前端技术交流群 前言 这是某211高校软件工程专业的师弟百度一面的题目和回答&#xff0c;全程高能&#xff0c;来看看你会多少~ 宇宙铁律&#xff0c;介绍下自己 还好&#xff0c;之前看到过敖丙大佬面试自我介绍5句话公式 - 掘…

C++6.0

思维导图 .编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a;比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0…

包教包会的Kotlin Flow教程

原文链接 包教包会的Kotlin Flow教程 公众号「稀有猿诉」 Kotlin中的Flow是专门用于处理异步数据流的API&#xff0c;是函数响应式编程范式(Functional Reactive Programming FRP)在Kotlin上的一个实现&#xff0c;并且深度融合了Kotlin的协程。是Kotlin中处理异步数据…

Springboot+vue的物流管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的物流管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的物流管理系统&#xff0c;采用M&#xff08;model&#xff09;…

Unity设备分级策略

Unity设备分级策略 前言 之前自己做的设备分级策略&#xff0c;在此做一个简单的记录和思路分享。希望能给大家带来帮助。 分级策略 根据拟定的评分标准&#xff0c;预生成部分已知机型的分级信息&#xff0c;且保存在包内&#xff1b;如果设备没有被评级过&#xff0c;则优…