【C++】OJ习题(初阶)

头像
🚀个人主页:奋斗的小羊
🚀所属专栏:C++
很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~

动图描述


💥1、字符串

💥1.1 字符串相加

请添加图片描述

有时候我们需要非常大的数据相加时,整型的范围不够,就可以将数据转换为字符串的形式运算,再将结果转回为整型。
整型相加时是从后往前加的,这里的字符串相加我们也从后往前加。不断取出两个字符串的末尾字符,转换为整形后相加,再用+=追加到字符串末尾,其中还要考虑进位的情况。
因为string类支持operator[],所以我们可以通过下标的方式遍历字符串。
其中两个字符串的第一位相加也可能有进位,所以循环结束后还需要判断进位是否为1。
因为我们是从后往前加的,所以最后还需要用reverse将字符串翻转过来。

class Solution {
public:
    string addStrings(string num1, string num2) {
        string s;
        int n = 0;
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        while (end1>=0 || end2>=0)
        {
            int n1 = end1>=0 ? num1[end1--] - '0' : 0;
            int n2 = end2>=0 ? num2[end2--] - '0' : 0;
            int ret = n1 + n2 + n;
            n = ret / 10;
            ret %= 10;
            s += ret + '0';
        }
        if (n == 1)
        {
            s += '1';
        }
        reverse(s.begin(), s.end());
        return s;
    }
};

用下标的方式从后往前遍历字符串,相加得到的值追加到字符串,最后再反转字符串。


💥1.2 验证回文字符串

在这里插入图片描述

将字符串存到一个stack和一个queue中,循环比较top(),当栈和队列为空时则字符串回文,当某次top()不相等时则不回文。
范围for遍历字符串,如果是符合我们要求的字符就插入栈和队列中。

class Solution {
public:
    bool isPalindrome(string s) {
        for (auto e : s)
        {
            if (e >= 'a' && e <= 'z')
            {
                _st.push(e);
                _qu.push(e);
            }
            if (e >= 'A' && e <= 'Z')
            {
                e += 32;
                _st.push(e);
                _qu.push(e);
            }
            if (e >= '0' && e <= '9')
            {
                _st.push(e);
                _qu.push(e);
            }
        }
        while (!_st.empty())
        {
            if (_st.top() != _qu.front())
            {
                return false;
            }
            _st.pop();
            _qu.pop();
        }
        return true;
    }
private:
    stack<int> _st;
    queue<int> _qu;
};

💥1.3 反转字符串

在这里插入图片描述

只需要反转对应的区间就行,注意不能越界。

class Solution {
public:
    string reverseStr(string s, int k) {
        for (size_t i = 0; i < s.size(); i += 2*k)
        {
            size_t n = i + k > s.size() ? s.size() : i + k;
            reverse(s.begin() + i, s.begin() + n);
        }
        return s;
    }
};

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

在这里插入图片描述

#include <iostream>
using namespace std;

int main() {
    string s;
    getline(cin, s);
    size_t pos = s.rfind(" ");
    size_t length = s.size() - pos - 1;
    cout << length << endl;
}

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

在这里插入图片描述

这种类似计数的题可以用哈希映射的方法,首先定义一个用于计数的数组,然后将字符串映射到数组中,再通过遍历字符串得到下标间接遍历数组来找出为1的元素,返回下标。
定义数组时需要初始化为全0。

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

💥1.6 反转字符串中的单词

在这里插入图片描述
reverse(s.begin(), s.end());
参数:双向迭代器,指向要反转的序列的初始和最终位置。使用的范围是[ )左闭右开。
从前往后遍历字符串,找" "空格的位置,用reverse反转单词。需要注意的是reverse的参数是左闭右开的。

class Solution {
public:
    string reverseWords(string s) {
        int pos1 = 0;
        int pos2 = s.find(" ", pos1);
        while (pos2 < s.size())
        {
            reverse(s.begin() + pos1, s.begin() + pos2);
            pos1 = pos2 + 1;
            pos2 = s.find(" ", pos1);
        }
        reverse(s.begin() + pos1, s.end());
        return s;
    }
};

总结

  1. 首先要认真审题,有思路了切不可着急写,先在心中推敲一下看当前思路是否可行,有大概的把握了再着手实现
  2. 不要太钻牛角尖,如果某个思路迟迟实现不了,就把视角放广一点寻找新的思路
  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值