【LeetCode】字符串汇总

每一位相加 进位

这一类型题都是对每一位的数相加,然后余数是相加得到的结果,商是进位;不够的补零

415. 字符串相加

class Solution {
public:
    string addStrings(string num1, string num2) {

        int cd=0;
        int sum=0;
        string ans;
        int a;
        int b;
        for(int i=num1.size()-1,j=num2.size()-1;i>=0||j>=0;i--,j--){
            a = i<0?0:num1[i]-'0';//短就补零
            b = j<0?0:num2[j]-'0';
            sum=a+b+cd;
            ans+=sum%10+'0'; //当前位得到的结果
            cd = sum/10; //进位
        }
        if(cd==1){ //最后一位进位
            ans+='1';
        }
        reverse(ans.begin(),ans.end());
        return ans;
        
    }
};

67. 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。

示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:

输入: a = “1010”, b = “1011”
输出: “10101”

class Solution {
public:
    string addBinary(string a, string b) {
        
        
        int lena = a.size();
        int lenb = b.size();
        int jinwei = 0;
        
        int ai;
        int bi;
        int sum=0;
  
        string res="";
        
        
        for(int i=lena-1, j=lenb-1;i>=0||j>=0;i--,j--){
            ai = i>=0?(a[i]-'0'):0;  //位数不够就给前面补零
            bi = j>=0?(b[j]-'0'):0;
            sum = ai+bi+jinwei;
            res+=sum%2+'0'; //余数就是加过后的值
            jinwei = sum/2; //大于2 就进位
            
        }

            if(jinwei==1){
                res+='1';
            }
        reverse(res.begin(),res.end());
        return res;
        
    }
};

反转和回文

反转和回文的共同点都是while(left<right)
反转是两两交换, 回文是两两比较相不相等

125. 验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:

输入: “race a car”
输出: false

class Solution {
public:
    bool isPalindrome(string s) {
       
        int right = s.size()-1;
        int left = 0;
        if(s.size()==0 or s.size()==1){return true;}
            while(left<right){
            if((s[left]>='a'&&s[left]<='z') || (s[left]>='A'&&s[left]<='Z') || (s[left]>='0'&&s[left]<='9')){                       if((s[right]>='a'&&s[right]<='z') || (s[right]>='A'&&s[right]<='Z') || (s[right]>='0'&&s[right]<='9')){
                if(s[left]>='A'&&s[left]<='Z'){
                    s[left] = s[left]+32;
                }
                if(s[right]>='A'&&s[right]<='Z'){
                    s[right] = s[right]+32;
                }
                
                if(s[left]!=s[right]){
                    return false;
                }
                else{
   
                    left++;
                    right--;

                }
                
            }
                else{ //right不是字母或数字
                    right--;
                    
                }
            }
                else{//left不是字母或数字
                    left++;
                }

        }
        

        return true;
        
    }
};

541. 反转字符串 II

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例:

输入: s = “abcdefg”, k = 2
输出: “bacdfeg”
要求:

该字符串只包含小写的英文字母。
给定字符串的长度和 k 在[1, 10000]范围内。

class Solution {
public:
    string reverseStr(string s, int k) {

        if(k>s.size()){
            reverse(s.begin(),s.end());
            return s;
        }
        for(int i=0;i<s.size();i=i+2*k){
            int end = i+k-1;
            if(end>s.size()){ //不够k个就把剩余的全都反转
                end = s.size()-1;
            }
            int start = i;
            while(start<end){ //反转前k个字符
                char tmp = s[start];
                s[start++] = s[end];
                s[end--] = tmp;
            }
        }
        return s;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值