LeetCode125验证一个字符串是否是回文 415字符串相加 541反转字符串 II

题一:

125. 验证回文串 - 力扣(LeetCode)icon-default.png?t=M666https://leetcode.cn/problems/valid-palindrome/submissions/

解决此题之前首先来学习一个库函数:

 代码解析:

class Solution {
public:
    bool IsNumberOrLetter(char c)
    {
        if(c>='a'&&c<='z')
        return true;
        if(c>='A'&&c<='Z')
        return true;
        if(c>='0'&&c<='9')
        return true;
        return false;
    }
    bool isPalindrome(string s) 
    {
        int begin=0,end=s.size()-1;
        while(begin < end)
        {
            while(begin<end && !IsNumberOrLetter(s[begin]))
            {
                begin++;
            }
            while(begin<end && !IsNumberOrLetter(s[end]))
            {
                end--;
            }
            if(tolower(s[begin])!=tolower(s[end]))
            return false;
            begin++;
            end--;
        }
            return true;
    }
};

题二:

415. 字符串相加 - 力扣(LeetCode)icon-default.png?t=M666https://leetcode.cn/problems/add-strings/

注意std提供的reverse函数需要传起始位置和末尾位置的迭代器

代码解析: 

法一:

class Solution {
public:
    string addStrings(string num1, string num2)
    {
        string s;
        int p1=num1.size()-1,p2=num2.size()-1;
        int next=0;//表示进位
        int num=0;
        while(p1>=0 || p2>=0)//任意一个为真都会进入循环,意味着两个同时遍历结束
        {
            int x1=0,x2=0;//每次循环都定义为0
            if(p1>=0)
            {
                x1=num1[p1]-'0';//注意要将char类型转换成int类型,需要减字符0
            }
            if(p2>=0)
            {
                x2=num2[p2]-'0';
            }
            num=x1+x2+next;
            if(num>9)
            {
                num=num%10;
                s+=num+'0';//注意要将int类型转换成char类型,需要加字符0
                next=1;
            }
            else
            {
                s+=num+'0';
                next=0;
            }
            p1--;
            p2--;
        }
        if(next!=0)//最后处理剩余的进位
        s+='1';
        reverse(s.begin(),s.end());
        return s;
    }
};

 法二:

class Solution {
public:
    string addStrings(string num1, string num2)
    {
        string s;
        int p1=num1.size()-1,p2=num2.size()-1;
        int next=0;//表示进位
        int num=0;
        int x1=0,x2=0;
        while(p1>=0 && p2>=0)//其中一个结束循环就结束
        {
            x1=num1[p1]-'0';//注意要将char类型转换成int类型,需要减字符0
            x2=num2[p2]-'0';
            num=x1+x2+next;
            if(num>9)
            {
                num=num%10;
                s+=num+'0';//注意要将int类型转换成char类型,需要加字符0
                next=1;
            }
            else
            {
                s+=num+'0';
                next=0;
            }
            p1--;
            p2--;
        }
        //循环结束过后判断到底是哪一个字符串先结束
        while(p1>=0)
        {
            x1=num1[p1]-'0';
            x2=0;
            num=x1+x2+next;
            if(num>9)
            {
                num=num%10;
                s+=num+'0';//注意要将int类型转换成char类型,需要加字符0
                next=1;
            }
            else
            {
                s+=num+'0';
                next=0;
            }
            p1--;
        }
        while(p2>=0)
        {
            x1=0;
            x2=num2[p2]-'0';
            num=x1+x2+next;
            if(num>9)
            {
                num=num%10;
                s+=num+'0';
                next=1;
            }
            else
            {
                s+=num+'0';
                next=0;
            }
            p2--;
        }
        if(next!=0)//最后处理剩余的进位
        s+='1';
        reverse(s.begin(),s.end());
        return s;
    }
};

题三:

力扣icon-default.png?t=M666https://leetcode.cn/problems/reverse-string-ii/

代码解析:

法一:

class Solution {
public:
    string reverseStr(string s, int k) 
    {
        int begin1=0,begin2=0;
        int n=s.size();//用n记录字符串存放字符的个数
        int r=(n+k)/4;//找到需要反转的字符次数与个数的关系,利用反转的字符次数来循环
        int num=0;
        while(r)
        {
            begin1=num*2*k;//定义反转开始的位置
            if(n-begin1>k)//如果剩余的个数大于k,那么begin2跳转即可
            {
                begin2=begin1+k-1;
            }
            else//如果小于等于k个
            {
               begin2=n-1;
            }
            while(begin1<=begin2)//循环反转
            {
                swap(s[begin1],s[begin2]);
                begin1++;
                begin2--;
            }
            num++;//跳到下一组的开头
            r--;//反转次数每次减1
        }
        return s;
    }
};

法二:

class Solution {
public:
    string reverseStr(string s, int k) 
    {
        int begin1=0,begin2=0;
        int n=s.size();//用n记录字符串存放字符的个数
        int r=(n+k)/4;//找到需要反转的字符次数与个数的关系,利用反转的字符次数来循环
        int num=0;
        while(r)
        {
            begin1=num*2*k;//定义反转开始的位置
            if(n-begin1>k)//如果剩余的个数大于k,那么begin2跳转即可
            {
                begin2=begin1+k;
            }
            else//如果小于等于k个
            {
               begin2=n;
            }
            reverse(s.begin()+begin1,s.begin()+begin2);
            num++;//跳到下一组的开头
            r--;//反转次数每次减1
        }
        return s;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~|Bernard|

你的鼓励是我写下去最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值