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

发布于:2023-01-16 ⋅ 阅读:(684) ⋅ 点赞:(0)

题一:

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;
    }
};

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到