C++力扣刷题记录——字符串(持续更新)

string的有用的常用操作

a[n],从0开始的
for(auto c : string)
string s2=s.substr(0,5) or (6)从下标6开始
s.append(args) 类似vector的push_back()
s.replace(range,args)在范围range内替换
其中args可以指str,pos,len或者n,c n个c 或者str等
swap(a,b)or a.swap(b);
‘/0’是字符串的结尾
reverse(,)可以换序
if(IP.find(’.’)==IP.npos)

1 58 最后一个单词的长度(简单)

给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。

如果不存在最后一个单词,请返回 0 。

说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。

从最后一个字母开始向前遍历,遇到第一个空格时结束。
需要注意的时末尾可能有很多的空格。

class Solution {
public:
    int lengthOfLastWord(string s) {
       int size=s.size();
       int result =0;
       while(size>0){
           if(s[size-1]==' '&&result==0){
               size=size-1;
           }
           else if( s[size-1]==' '){
               return result;
           }
           else{
                result++;
                size--;
           }
       } 
       return result;
    }
};

2 557 反转字符串中的单词(简单)

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
在这里插入图片描述

思路
找空格 或者 结束符
然后记住位置ptr及单词的左右标值,把前面的全部换位置
换完后判断是 ‘\0’ 还是 ’ ’ 分别给单词的左右标值赋值

class Solution {
public:
    string reverseWords(string s) {
        int num=s.size();
        int left=0,right=0,ptr=0;
        while(s[right]!='\0'){
            while(s[right]!=' '&&s[right]!='\0'){
                right++;
            }
                right=right-1;
                ptr = right;
            while(right>left){
                swap(s[left],s[right]);
                left++;
                right--;
            }
            if(s[ptr+1]=='\0'){
                right=ptr+1;    
            }
            else{
            left=ptr+2;
            right=ptr+2;                
            }
        }
        return s;
    }

3 709 转换成小写字母(简单)

实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串
在这里插入图片描述
在这里插入图片描述

思路
判断每个字符是不是在大写A到Z之间的
如果是就+32
注意要是想改变str for each必须是引用的。

class Solution {
public:
    string toLowerCase(string str) {
        for(auto &c:str){
            if(c>='A'&&c<='Z')
                c=c+32;
        }
        return str;
    }
};

4 415字符串相加(简单)

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
在这里插入图片描述

思路
双指针从屁股后面指到最前面。
但是 需要注意的是 姿符和数字差了’0’

class Solution {
public:
    string addStrings(string num1, string num2) {
        string t ;
        int sum = 0, i = num1.size()-1, j = num2.size()-1;
        while(i >= 0 || j >= 0 || sum)
        {
            if(i >= 0)   sum += num1[i--] - '0';
            if(j >= 0)   sum += num2[j--] - '0';
            t.push_back(sum%10 + '0');
            sum /= 10;
        }
        reverse(t.begin(),t.end());
        return t;
    }
};
class Solution {
public:
    string addStrings(string num1, string num2) {
        int i = num1.length() - 1, j = num2.length() - 1, add = 0;
        string ans = "";
        while (i >= 0 || j >= 0 || add != 0) {
            int x = i >= 0 ? num1[i] - '0' : 0;
            int y = j >= 0 ? num2[j] - '0' : 0;
            int result = x + y + add;
            ans.push_back('0' + result % 10);
            add = result / 10;
            i -= 1;
            j -= 1;
        }
        // 计算完以后的答案需要翻转过来
        reverse(ans.begin(), ans.end());
        return ans;
    }
};

5 151反转字符串里的单词

给定一个字符串,逐个翻转字符串中的每个单词。
在这里插入图片描述

先取倒叙reverse(),然后用栈stack把单词倒叙了。

class Solution {
public:
    string reverseWords(string s) {
		if(s.empty())
            return s;
        string a;
		int count = 0;
		stack<char> mystack;
		reverse(s.begin(), s.end());

		for (auto c : s) {
			if (c != ' ')
				mystack.push(c);
			if (c == ' '&&!mystack.empty()) {
				while (!mystack.empty()) {
					a.push_back(mystack.top());
					mystack.pop();
				}

					a.push_back(' ');
			}
		}
        while (!mystack.empty()) {
			a.push_back(mystack.top());
			mystack.pop();
				
        }
        if(a.size()>0)
		if(a[a.size()-1]==' ')
            a = a.substr(0, a.size() - 1);
		return a;
	}
};

呵呵开始做的时候没有考虑空字符串&空格字符串

猜你喜欢

转载自blog.csdn.net/m0_37668446/article/details/107598576
今日推荐