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

这篇具有很好参考价值的文章主要介绍了C++:OJ练习(每日练习系列)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++:OJ练习(每日练习系列),C++练习,c++,开发语言,深度学习,算法,力扣,c语言

编程题:

题一:字符串相加

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

C++:OJ练习(每日练习系列),C++练习,c++,开发语言,深度学习,算法,力扣,c语言

思路一:

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

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

第三步:只要有进位或还有数没有加完继续循环利用三目运算:有符号+符号,无符号+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)

C++:OJ练习(每日练习系列),C++练习,c++,开发语言,深度学习,算法,力扣,c语言

思路一:

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

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

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)

C++:OJ练习(每日练习系列),C++练习,c++,开发语言,深度学习,算法,力扣,c语言

思路一:

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

第二步:只要后面还有字符就继续执行循环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)

C++:OJ练习(每日练习系列),C++练习,c++,开发语言,深度学习,算法,力扣,c语言

思路一:

第一步:定义变量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)

C++:OJ练习(每日练习系列),C++练习,c++,开发语言,深度学习,算法,力扣,c语言

思路一:

第一步创建: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";
    }

};

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

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

                                              C++:OJ练习(每日练习系列),C++练习,c++,开发语言,深度学习,算法,力扣,c语言文章来源地址https://www.toymoban.com/news/detail-752288.html

到了这里,关于C++:OJ练习(每日练习系列)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二叉树OJ练习题(C语言版)

    目录  一、相同的树  二、单值二叉树  三、对称二叉树  四、树的遍历 前序遍历 中序遍历 后序遍历  五、另一颗树的子树  六、二叉树的遍历  七、翻转二叉树  八、平衡二叉树 链接:100. 相同的树 - 力扣(LeetCode) 首先考虑比较时节点为空的情况,当比较到二者节点都

    2024年02月19日
    浏览(26)
  • 栈&队列OJ练习题(C语言版)

    目录 一、括号匹配问题 思路: 完整版C语言代码:   讲解: 二、用队列实现栈 思路: 完整版C语言代码:  讲解:  三、用栈实现队列 思路: 完整版C语言代码: 讲解: 四、 设计循环队列 思路: 完整版C语言代码: 讲解: 如果栈和队列忘了,不妨看看小生的这两篇复习

    2024年02月07日
    浏览(28)
  • 【C++ OJ练习】5.字符串最后一个单词的长度

    字符串最后一个单词的长度_牛客题霸_牛客网 倒着找第一个空格的下标 用下标之间的差来计算  【C++ OJ练习】5.字符串最后一个单词的长度 完

    2024年02月13日
    浏览(31)
  • 每日OJ题_算法_滑动窗口⑧_力扣76. 最小覆盖子串

    目录 力扣76. 最小覆盖子串 解析及代码 76. 最小覆盖子串 - 力扣(LeetCode) 难度 困难 给你一个字符串  s  、一个字符串  t  。返回  s  中涵盖  t  所有字符的最小子串。如果  s  中不存在涵盖  t  所有字符的子串,则返回空字符串  \\\"\\\"  。 注意: 对于  t  中重复字符,

    2024年01月23日
    浏览(29)
  • 【深度学习】GPT系列模型:语言理解能力的革新

    自然语言理解包括一系列不同的任务,例如文本蕴涵、问答、语义相似度评估和文档分类。尽管大量的未标记文本语料库很充足,但用于学习这些特定任务的标记数据却很稀缺,使得判别式训练模型难以达到良好的表现。 我们证明,在多样化的未标记文本语料库上进行生成式

    2024年02月08日
    浏览(38)
  • 每日练习---C语言

    目录 前言: 1.打印菱形 1.1补充练习  2.打印水仙花 2.1补充训练   记录博主做题的收获,以及提升自己的代码能力,今天写的题目是: 打印菱形、打印水仙花数 。   我们先看到牛客网的题:OJ链接    题目解析:多组输入一个值(我们用n来控制)用来控制菱形的打印。  

    2024年02月05日
    浏览(21)
  • C++ 树进阶系列之探讨深度搜索算法查找环的细枝末节

    对于 基环树 的讲解,分上、下 2 篇,上篇以理解连通分量、环以及使用深度搜索算法检查连通性和环为主,下篇以基于基环树结构的应用为主。 什么是基环树? 所谓基环树指由 n 个节点 n 条边所构建而成的连通图 。 如下图所示,树结构中共有 7 个节点, 6 条边。此时在树

    2024年02月02日
    浏览(25)
  • 【游戏开发算法每日一记】使用随机prime算法生成错综复杂效果的迷宫(C#,C++和Unity版)

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity基础实战 1.首先全部判定为墙,最外的为路包裹墙( 类似于防止数组越界 ) 2.红色为它的检测范围(假设检测点在如图所示的位置)—

    2024年02月05日
    浏览(33)
  • 每日OJ题_算法_滑动窗口⑦_力扣30. 串联所有单词的子串

    目录 力扣30. 串联所有单词的子串 解析及代码 30. 串联所有单词的子串 - 力扣(LeetCode) 难度 困难 给定一个字符串  s   和一个字符串数组  words 。   words  中所有字符串  长度相同 。   s   中的  串联子串  是指一个包含   words  中所有字符串以任意顺序排列连接起来的

    2024年01月21日
    浏览(34)
  • 每日OJ题_算法_递归④力扣24. 两两交换链表中的节点

    目录 ④力扣24. 两两交换链表中的节点 解析代码 24. 两两交换链表中的节点 难度 中等 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 示例 2: 示例 3: 提示: 链表

    2024年02月20日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包