C++之string(OJ练习)

String


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

题目链接:https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37\&\&tqId=21224\&rp=5\&ru=/activity/oj\&qru=/ta/huawei/question-ranking

此题比较简单,我们只需要找到最后一个空格,就可以确定最后一个单词的起始位置,如果没有空格,最后一个单词的长度即为字符串长度

针对此题,我们可以采取反向思维,从字符串末尾开始寻找空格,第一个空格位置就相当于正向寻找的最后一个空格位置

但是此题有个隐藏的坑,那就是我们需要用到一个非成员方法,getline()方法

如图可见,getline方法的作用就是一直读取,直到读取到指定的delim字符才停止,并且delim字符不会被存入字符串中,而是被丢弃掉,delim默认为'\n'换行符

此外,如果我们不使用getline方法,使用cin >> s读取字符串s,那么当我们输入多个单词,譬如a hello时,根据题目来看,hello应该是最后一个单词,但是实际输出的确是以a为最后一个单词得到的结果,这是错误的

代码展示:

二、验证一个字符串是否回文

题目链接:https://leetcode.cn/problems/valid-palindrome/

这道题的要求其实就是给我们一个字符串,我们由这个字符串得到一个只有字母数字字符的字符串,并且其中的字母字符必须均为小写,如果该字符在原字符串中为大写字母,则必须转化为小写

得到该字符串后,我们只需要对它进行判断是否回文即可

针对该题,我们有两种实现思路

1. 直接比较法

我们可以在得到符合要求的新字符串之后,使用内置成员方法将该字符串逆置的结果与该字符串进行比较,如果相等,则证明该字符串为回文串,代码如下:

  1. 双指针寻找法
    这种思路借鉴了我们双指针的思想,并且通过使用成员方法rfind来进行操作,代码如下:

    我们通过一个for循环,来控制双指针iend的遍历,我们对字符串s1进行倒序查找,以字符串abcbba为例:

end最开始在末尾'a'的位置,我们从s1end位置开始,往前寻找s1[i],此时的s1[i]代表开头的'a',此时判断从end位置开始查找s[i],查找到就在end位置,说明s1[i]s1[end]两者相等,循环继续

进行第二次循环,end在倒数第一个'a'的位置,i在开头第一个'b'的位置,从end(也就是此时的倒数第一个'b'的位置)开始查找s[i],此时为'b',查找到的位置与end相等,循环继续

进行第三次循环,end在倒数第二个'b'的位置,而i'c'的位置,此时从end位置开始查找'c',发现查找到的位置在i的位置而不是end,这说明此时s1[end]s1[i]并不相等,且此时 i <= end,所以判定该字符串不为回文串,返回false

至于字符串为回文串的例子我们就不列举了,大家可以自行画图理解一下

三、反转字符串

题目链接:https://leetcode.cn/problems/reverse-string-ii/

代码如下:

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

题目链接:https://leetcode.cn/problems/reverse-words-in-a-string-iii/

此题比较简单,只需要查找字符串中的空格位置,找到每一个单词,进行逆置即可,我们可以在原字符串中进行逆置操作直接返回原字符串,也可以在另一个字符串中进行逆置,代码如下:
1. 原地逆置

2. 异地逆置

五、字符串相乘

题目链接:https://leetcode.cn/problems/multiply-strings/description/

代码如下:

cpp 复制代码
class Solution {
public:
    string multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") return "0";
        int m = num1.size(), n = num2.size();
        vector<int> res(m + n, 0);
        for (int i = m - 1; i >= 0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                int mul = (num1[i] - '0') * (num2[j] - '0');
                int p1 = i + j, p2 = i + j + 1; 
                int sum = mul + res[p2]; 
                res[p2] = sum % 10;
                res[p1] += sum / 10;
            }
        }
        string ans;
        for (int val : res) {
            if (!(ans.empty() && val == 0)) ans.push_back(val + '0');
        }
        return ans.empty() ? "0" : ans;
    }
};

六、字符串转整形数字

题目链接:https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/submissions/720624306/

代码如下:

本题唯一需要注意的地方就是,当给我们的字符串为word 123456这种情况时,我们应该输出的结果是0,因为我们做完预处理开始正式读取字符串时,读取到的字符是w,判断字符w不为数字,不在0-9之间,那么后面的字符就不会再进行读取了,也就是说123456这串数字并不会被读取到,而是直接结束循环并返回,此时返回0

七、字符串相加

题目链接:https://leetcode.cn/problems/add-strings/

此题需要处理的情况就是进位,除此外,如果我们想对两个字符串分别进行相加,比如我们将while循环里的判断条件改为且,&&,此时我们需要注意的情况会多很多,比如说当carry等于1时的边界情况,如果num1和num2的长度相等,这需要讨论一次,如果num1和num2的长度不相等呢?我们还需要讨论一次,如果num1和num2长度不相等的情况下,进位变量carry为1,我们还需要考虑长的那部分在第一次加上进位之后,会不会继续产生进位,因为我们不考虑使用这种方法,而是选择简单的,两者同时进行的方法,即循环进行判断条件改为或,||

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

题目链接:https://leetcode.cn/problems/first-unique-character-in-a-string/

代码如下:

相关推荐
freshman_y2 小时前
一篇介绍C语言中二级指针和二维数组的文章
c语言·开发语言
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 199. 二叉树的右视图 | C++ DFS 逆序遍历
c++·leetcode·深度优先
-Marks-2 小时前
【C++编程】STL简介 --- (是什么 | 版本发展历程 | 六大组件 | 重要性缺陷以及如何学习)
开发语言·c++·学习·stl·stl版本
HealthScience2 小时前
【Bib 2026】基因最新综述(有什么任务、benchmark、代表性模型)
android·开发语言·kotlin
wjs20242 小时前
CSS 网格元素
开发语言
Java小白笔记3 小时前
OpenClaw 实战方法论
java·开发语言·人工智能·ai·全文检索·ai编程·ai写作
CoderCodingNo3 小时前
【信奥业余科普】C++ 的奇妙之旅 | 12:程序的交互与加工——数据的输入与算术运算
开发语言·c++
yx868xy3 小时前
Cuda加速直线拟合
c++·cuda