跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 卖家故事 > C++:OJ练习(每日练习系列)

C++:OJ练习(每日练习系列)

时间:2024-04-09 15:25:38 来源:网络cs 作者:欧阳逸 栏目:卖家故事 阅读:

标签: 练习  系列 
阅读本书更多章节>>>>

编程题:

题一:字符串相加

415. 字符串相加 - 力扣(LeetCode)

思路一:

第一步:需要获取字符串的两个尾节点下标

第二步:创建用于记录进位数、获得的字符串的变量

第三步:只要有进位或还有数没有加完继续循环利用三目运算:有符号+符号,无符号+0

第四步:最后将得到的字符串逆置,就是需要的结果。

class Solution {public:    string addStrings(string num1, string num2)     {        //获取字符串的尾节点        int it1 = num1.size() - 1;        int it2 = num2.size() - 1;        //记录进位数        int count = 0;        //获得的字符串        string s1 = "";        //有进位或还有数没有加完        while(it1 >= 0 || it2 >= 0 || count != 0)        {            //三目运算:有符号+符号,无符号+0            int x = it1 >= 0 ? num1[it1] - '0' : 0;            int y = it2 >= 0 ? num2[it2] - '0' : 0;            int n = x + y + count;            int num = n % 10;            count = n / 10;            s1.push_back(num + '0');            --it1;            --it2;        }        //得到的是逆置的字符串        reverse(s1.begin(),s1.end());        return s1;    }};

题二:验证回文串

125. 验证回文串 - 力扣(LeetCode)

思路一:

第一步:遍历字符串将大写改小写并删除非字母和数字的字符;

第二步:判断对称比较字符是否相等;

class Solution {public:    bool isPalindrome(string s)     {        //遍历字符串将大写改小写并删除非字母和数字的字符        for(int i = 0; i < s.size();i++)        {            s[i] = tolower(s[i]);            if((s[i] < 'a' || s[i] > 'z') && (s[i] < '0' || s[i] > '9'))            {                s.erase(i,1);                i--;            }        }        //对称比较字符是否相等        int left = 0;        int right = s.size() - 1;        while(left < right)        {            if(s[left] != s[right])            {                return false;            }            left++;            right--;        }        return true;    }};

题三:反转字符串

541. 反转字符串 II - 力扣(LeetCode)

思路一:

第一步:分别创建记录起始位置和末尾位置的节点

第二步:只要后面还有字符就继续执行循环1.计数2k个字符,就反转这2k字符中的前k个字符;2.字符小于2k但大于或等于k个,则反转前k个字符;3.剩余字符少于k个,将剩余字符全部反转。

特别注意:reverse是逆置左闭右开的区间!!!

class Solution {public:    string reverseStr(string s, int k)     {        //分别创建记录起始位置和末尾位置的节点        string::iterator cur = s.begin();        string::iterator tail = s.end();        //只要后面还有字符就继续执行        while(cur != tail)        {            //计数2k 个字符,就反转这2k字符中的前k个字符            if(cur + 2*k <= tail)            {                //需要注意reverse是左闭右开的区间                reverse(cur,cur + k );                cur += 2*k;            }            //字符小于2k但大于或等于k个,则反转前k个字符            else if(cur + k <= tail)            {                reverse(cur,cur + k );                break;            }            //剩余字符少于k个,将剩余字符全部反转            else            {                reverse(cur,tail);                break;            }        }        return s;    }};

思路二:

        反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。

class Solution {public:    string reverseStr(string s, int k) {        int n = s.length();        for (int i = 0; i < n; i += 2 * k) {            reverse(s.begin() + i, s.begin() + min(i + k, n));        }        return s;    }};

题四:反转字符串的单词

557. 反转字符串中的单词 III - 力扣(LeetCode)

思路一:

第一步:定义变量left、right从第一个字符开始,以及tail来记录字符串长度

第二步:如果没有超过字符串长度就继续循环1.定位一个单词的区间、2。逆置(我们这里用的是下标访问,无法使用reverse来进行逆置)、3.再排除空格的影响;

void my_reverse(string& s1,int left,int right){    while(left < right)    {        swap(s1[left],s1[right]);        ++left;        --right;    }}class Solution {public:    string reverseWords(string s)     {        int left = 0;        int right = 0;        int tail = s.size();        //没有超过字符串长度就循环        while(right < tail)        {            //定位一个单词的区间            while(s[right] != ' ' && s[right] != '\0')            {                ++right;            }            //逆置            my_reverse(s,left,right-1);            //排除空格的影响            while(s[right] == ' ')                ++right;            left = right;        }        return s;    }};

题五:字符串相乘

43. 字符串相乘 - 力扣(LeetCode)

思路一:

第一步创建:1.得到最后的结果的s1、2.count用于记录进位、enter用于记录进行了几次乘加;

第二步:while循环中1.n1做为被乘数,n2做为乘数,tmp用于记录当前的乘积2.再内置一个while循环实现乘法,3.将所得结果逆置,4.对每一次的乘积进行当前结果求和(这里直接在题意字符串相加的基础上缩小了相加的范围实现了乘加);

第三步:最后:判断:如果字符串全为‘0’,则返回“0”,否则正常输出计算所得的字符串。

class Solution {public:string addStrings(string num1, string num2,int enter)     {        //获取字符串的尾节点        int it1 = num1.size() - 1 -enter;        int it2 = num2.size() - 1;        //记录进位数        int count = 0;        //获得的字符串        string s1 = "";        //有进位或还有数没有加完while(enter--){s1.push_back(num1[it1+enter+1]);}        while(it1 >= 0 || it2 >= 0 || count != 0)        {            //三目运算:有符号+符号,无符号+0            int x = it1 >= 0 ? num1[it1] - '0' : 0;            int y = it2 >= 0 ? num2[it2] - '0' : 0;            int n = x + y + count;            int num = n % 10;            count = n / 10;            s1.push_back(num + '0');            --it1;            --it2;        }        //得到的是逆置的字符串        reverse(s1.begin(),s1.end());        return s1;    } string multiply(string num1, string num2)     {        //得到最后的结果的s1        string s1;        //count用于记录进位        int count = 0;        //enter用于记录进行了几次乘加        int enter = 0;        //n1做为被乘数        int n1 = num1.size() - 1;        while(0 <= n1)        {            //n2做为乘数            int n2 = num2.size() - 1;            //tmp用于记录当前的乘积string tmp;            //实现乘法            while(0 <= n2 || count != 0)            {int x = n1 >= 0 ? num1[n1] - '0' : 0;int y = n2 >= 0 ? num2[n2] - '0' : 0;                int num = x * y + count;                count = num / 10;                tmp.push_back((num % 10) + '0');                --n2;            }            //所得结果逆置            reverse(tmp.begin(),tmp.end());            //对每一次的乘积进行当前结果求和            s1 = addStrings(s1,tmp,enter);            ++enter;--n1;        }        //判断:如果字符串全为‘0’,则返回“0”        int nn = s1.size() ;        while(nn--)        {            if(s1[nn] - '0' != 0)            {                return s1;            }        }        return "0";    }};

本人实力有限可能对一些地方解释和理解的不够清晰,可以自己尝试读代码,或者评论区指出错误,望海涵!

感谢大佬们的一键三连! 感谢大佬们的一键三连! 感谢大佬们的一键三连!

                                              

阅读本书更多章节>>>>

本文链接:https://www.kjpai.cn/gushi/2024-04-09/156065.html,文章来源:网络cs,作者:欧阳逸,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论