string类相关题目

例1 

字符串相加

string类相关题目_第1张图片

string类相关题目_第2张图片

分析:看length  肯定是不能直接stoi直接加,所以是自实现

思路:

代码如下:全部走完才算完,最后要判断  进位,

考虑到头插损耗大,可以用尾差加逆置来等价实现

考虑到多次扩容的损耗,提前计算出来,一次扩好

class Solution {
public:
    string addStrings(string num1, string num2) {
        int end1 = num1.size() - 1;
        int end2 = num2.size() - 1;
        string strRet;
        strRet.reserve(end1 > end2 ? end1 + 2 : end2 + 2);
        int next = 0, ret = 0;
        while(end1 >= 0 || end2 >= 0)
        {
            int val1 = end1 >= 0 ? num1[end1] - '0' : 0;
            int val2 = end2 >= 0 ? num2[end2] - '0' : 0;
            int sum = val1 + val2 + next;
            next = sum / 10;
            ret = sum % 10;

            strRet += (ret + '0');
            end1--;
            end2--;
        }
        if(next == 1)
            strRet += '1';
        reverse(strRet.begin(), strRet.end());
        return strRet;
    }
};

例2

仅仅反转字母

string类相关题目_第3张图片

题目也是很好理解

注意swap之后left和right也要变,不然交换一次后就会一直交换

三个while的left

class Solution {
public:
    bool isletter(char& c)
    {
        if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
            return true;
        else 
            return false;
    }

    string reverseOnlyLetters(string s) {
        int left = 0, right = s.size() - 1;
        while(left < right)
        {
            while(left < right && !isletter(s[left]))
                left++;
            while(left < right && !isletter(s[right]))
                right--;

            swap(s[left], s[right]);
            left++;
            right--;               
        }
        return s;
    }
};

例3

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

string类相关题目_第4张图片

可以用哈希,但是计数排序思想更快

相当于把“leetcode”转化为 12211111

注:int array[26] = {0};,这里是{}

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

例4

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

注:cin遇到空格就会停止,getline是遇到‘\n’停止读取

-1就是string::npos

#include 
using namespace std;

int main() {
    string s;
    getline(cin, s);
    int pos = s.rfind(' ');
    if(pos != -1)
        cout << s.size() - pos - 1 << endl;
    else 
        cout << s.size() << endl;
}
// 64 位输出请用 printf("%lld")

你可能感兴趣的:(算法)