首页 > 编程语言 >【C/C++】速通涉及string类的经典编程题

【C/C++】速通涉及string类的经典编程题

时间:2024-09-22 11:50:31浏览次数:6  
标签:tmp ps begin 速通 int C++ size string

【C/C++】速通涉及string类的经典编程题

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

本题牛客网链接:
在这里插入图片描述

原理:从字符串最后倒着往前遍历,遇到第一个空格标记其下标

代码实现:(含注释)

#include <iostream>
using namespace std;
#include <string>
int main() {
    string s;
    getline(cin, s);//读取一整行数据,遇到空格或“\0”照样读取
    int ret = s.rfind(' ', s.size() - 1);
    if(ret == s.size())//只有一个字符时
    printf("%lld",ret);
    else
    printf("%lld",(s.size() - 1 - ret));
}

二.验证回文串

本题LeetCode链接:
在这里插入图片描述

解法一:

原理:先将字符串中大写字符转化为对应小写字符,然后将数字和字符(注意不可拷贝空格)拷贝到tmp对象中,用双指针分别从tmp对象首尾开始向字符串中间遍历,遍历过程中判断两指针指向字符是否相等

代码实现:(含注释)

class Solution {
public:
bool isPalindrome(string s) {
    string tmp;
    //将大写字母转化为小写
    for (int i = 0; i < s.size(); i++)
    {
        if (s[i] >= 'A' && s[i] <= 'Z')
        {
            s[i] += 32;
        }
    }
    int k = 0;
    for (int k = 0; k < s.size(); k++)//看题看题!!!字符和数字都要拷贝到tmp中
    {
        if ((s[k] >= 'a' && s[k] <= 'z') ||(s[k] >= '0' && s[k] <= '9')
         && s[k] != ' ' )
            tmp += s[k];
    }
    //双指针法
    int begin = 0, end = tmp.size() - 1;
    while (begin < end)
    {
        if (tmp[begin] != tmp[end])
            return false;
        begin++;
        end--;
    }
    return true;
}
};

解法二:(推荐)

原理:充分运用库函数的特性,再结合反向迭代器

1. 函数isalnum介绍:

  1. 函数原型:bool isalnum(auto ch);
  2. 函数功能:
    (1) 检查范围‌:isalnum函数检查传入的字符是否属于字母(大写或小写)或数字(0-9)的ASCII码范围。
    ‌(2)返回值‌:如果字符是字母或数字,则返回非零值(通常为真值);否则,返回零(表示假值)。

2. 函数tolower介绍:

  1. 函数原型:auto tolower(auto ch);
  2. 函数功能:将大写字母转换为小写字母。

3. 代码实现:

class Solution {
public:
bool isPalindrome(string s) {
    string tmp;
    for(auto ch : s)
    {
        if(isalnum(ch))//函数isalnum
        {
            tmp += tolower(ch);//函数tolower
        }
    }
    string tmp_rev(tmp.rbegin(), tmp.rend());
    return tmp == tmp_rev;
}
};

三.翻转字符串II:区间部分翻转

本题LeetCode链接:
在这里插入图片描述

原理:充分运用reverse函数,特殊情况特殊处理,注意把控区间边界

代码实现:(含注释)

class Solution {
public:
  string reverseStr(string s, int k) {
    int ps = 0;
    if(k > s.size())//特殊情况一
    {
        reverse(s.begin(), s.end());
        return s;
    }

    if(ps + 2*k > s.size())//特殊情况二
    {
        reverse(s.begin(), s.begin() + k);
        return s;
    }

    while (ps + 2*k <= s.size())//边界问题等于不可少
    {
        reverse(s.begin() + ps, s.begin() + ps + k);
        ps += 2 * k;
        if (ps + k > s.size())
        {
            reverse(s.begin() + ps, s.end());
        }
        if (ps + 2 * k > s.size() && ps + k <= s.size())//边界问题等于不可少
        {
            reverse(s.begin() + ps, s.begin() + ps + k);
        }
    }
    return s;
}
};

四.翻转字符串III:翻转字符串中的单词

本题LeetCode链接:
在这里插入图片描述

原理:充分运用reverse函数,首尾单词特殊处理,注意区间边界

代码实现:(含注释)

class Solution {
public:
    string reverseWords(string s) {
        int len = 0;//单词的长度
        int k = 0;//单词首字母下标
        for(int i = 0; i < s.size(); i++)
        {
            if(k == 0 && s[i] == ' ')//解决第一个单词的颠倒
            {
                len = i - k; 
                reverse(s.begin() + k, s.begin() + k + len );
                k = i;
            }
            if(s[i] == ' ' )//解决中间单词的颠倒
            {
                len = i - k + 1;
                reverse(s.begin() + k , s.begin() + k + len );
                k = i;
            }
        }

        //解决最后一个单词的颠倒
        int j = s.rfind(' ', s.size() - 1);
        reverse(s.begin() + j + 1, s.end());
        
        return s;
    }
};

标签:tmp,ps,begin,速通,int,C++,size,string
From: https://blog.csdn.net/2303_80737493/article/details/142407416

相关文章

  • 01背包问题之背包容量为什么要倒序遍历?(以C++代码具体实现为例)
    首先是先阐述一下背包问题:有n件物品和一个最多能背重量为w的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用依次,求解将哪些物品装入背包里物品价值总和最大。这里不解释代码的其他部分,只对代码中的背包容量遍历进行具体的解释,首先给出遍历部分的代......
  • C++ 笔试常用算法模板
    C++笔试常用算法模板一、二叉树遍历DFSBFS二、回溯模板三、动态规划01背包朴素版本滚动数组优化完全背包朴素版本滚动数组优化最长递增子序列朴素版本贪心+二分优化最长公共子序列最长回文子串四、图建图邻接矩阵邻接表图的遍历DFSBFS拓扑排序并查集最小生成树Kr......
  • C++: 使用红黑树模拟实现STL中的map和set
    目录1.红黑树的迭代器++和--2.改造红黑树3.set的模拟实现4.map的模拟实现5.RBTree的改造代码博客主页:酷酷学正文开始1.红黑树的迭代器迭代器的好处是可以方便遍历,是数据结构的底层实现与用户透明打开C++的源码我们可以发现,其实源码中的底层大概如下......
  • 南沙C++信奥老师解一本通题:1372:小明的账单
    ​ 【题目描述】小明在一次聚会中,不慎遗失了自己的钱包,在接下来的日子,面对小明的将是一系列的补卡手续和堆积的账单…在小明的百般恳求下,老板最终同意延缓账单的支付时间。可老板又提出,必须从目前还没有支付的所有账单中选出面额最大和最小的两张,并把他们付清。还没有支付的......
  • 【最新原创毕设】基于SpringBoot的乐山市景区旅游攻略网+49117(免费领源码)可做计算机毕
    目 录摘要1绪论1.1选题背景与意义1.2开发现状1.3论文结构与章节安排2 乐山市景区旅游攻略网站系统分析2.1可行性分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3......
  • 最新毕设-Node.js-游戏网站-031726(免费领项目)可做计算机毕业设计JAVA、PHP、爬虫、APP
    游戏网站的设计摘 要基于网络游戏的蓬勃发展,游戏网站发挥着吸引玩家和提高玩家之间的互动性的重要作用,因而,建设了一个以游戏为中心的游戏官网。 该游戏提供了一个大型的玩家交流互动平台,包括用户管理、游戏社区、游戏信息、分类信息、游戏资讯、论坛分类列表、新闻分类列......
  • C++ | C++中与const相关的权限放大和缩小详解
    文章目录C++中与`const`相关的权限放大和缩小详解一、`const`的重要性及基本概念二、权限缩小(从非`const`到`const`)(一)指针的权限缩小(二)引用的权限缩小三、权限放大(从`const`到非`const`)(一)一般情况下的限制(二)通过特定类型转换进行权限放大四、注意事项C++中与const......
  • 《C++中的神秘利器——类型萃取(Type Traits)深度解析》
    在C++的浩瀚世界中,类型萃取(TypeTraits)犹如一把神奇的钥匙,为开发者打开了高效编程的大门。那么,C++中的类型萃取究竟有什么用呢?让我们一同深入探究。一、类型萃取的基本概念类型萃取从字面意思理解,就是帮助我们挑选某个对象的类型,筛选特定的对象来做特定的事。它是C++模......
  • 《C++高效字符串拼接之道:解锁性能与优雅的完美结合》
    在C++编程中,字符串拼接是一项常见的操作。然而,如果不采用合适的方法,字符串拼接可能会导致性能低下和代码繁琐。本文将深入探讨如何在C++中进行高效的字符串拼接,带你解锁性能与优雅的完美结合。一、C++中字符串拼接的常见方法及问题在C++中,有几种常见的字符串拼接方法,但......
  • C++:类和对象OJ题
    目录一、求1+2+3+...+n二、计算日期到天数的转换三、日期差值四、打印日期一、求1+2+3+...+n   这里先把题目链接放在这里求1+2+3.....+n描述:求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)   写一......