【C++】string典型oj题

2024-08-24 21:36
文章标签 c++ string oj 典型

本文主要是介绍【C++】string典型oj题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前言
  • 字符串相加
  • 字符串相乘
  • 字符串转换整数

请添加图片描述

前言

  上一节我们已经仔细讲解了关于string的各种重要接口的使用:【C++】string的使用。下面我们来使用这些接口写几道OJ题。

字符串相加

415.字符串相加-力扣
在这里插入图片描述
  这道题目的意思也很简单,就是想让我们模拟实现加法的过程。我们要搞清楚字符串如何相加,如何进位等一些问题即可。
  我们做加法都是从个位开始依次相加,因此我们可以通过下标+[]的形式取出每个字符数,再减去’0’,既是对应的数字。

如"123",想要取出个位数就是num[2]-‘0’,即可得到数字3。

然后就可以开始计算了。

  • 首先定义一个串,我们知道加法的结果最多只会比位数多的再多一位,因此我们就知道需要开多少空间。
  • 结束标志:只有当两个串的所有数字都加完后才结束
  • 进位计算。
  • 得到数字后进行头插(效率较低)
class Solution {
public:string addStrings(string num1, string num2) {string str;//开空间str.reserve(max(num1.size(), num2.size()) + 1);//知道两个串分别有多少位数int end1 = num1.size() - 1;int end2 = num2.size() - 1;int next = 0;//进位while(end1 >= 0 || end2 >= 0)//只有当两个串的所有数字都加完后才结束{//如果end1或者end2不大于0,证明它已经加完了,此时用0来填充int x1 = end1 >= 0 ? num1[end1--] - '0' : 0;int x2 = end2 >= 0 ? num2[end2--] - '0' : 0;int x = x1 + x2 + next;next = x/10;x = x%10;str.insert(str.begin(), x +'0');//头插,要加上'0'才是字符才能插入}
//例如9+1,它的x是0,已经插入了,但是进位next还没有加上,因此还要判断是否有多的进位没加上,如果有直接头插'1'即可。if(next == 1){str.insert(str.begin(), '1');}return str;}
};

  我们知道头插的效率很低,上面代码的时间复杂度是O(n2),因此我们建议尾插,然后逆置即可。

	{//前面代码不变//...x = x%10;str += (x + '0');}if(next == 1){str += '1';}reverse(str.begin(), str.end());//库里面已经提供好了的,在平时使用时要加上头文件#include<algorithm>return str;

字符串相乘

43.字符串相乘-力扣
在这里插入图片描述
  这道题和上一道字符串相加有着异曲同工之处。

  • 如果 num1和num2之一是 0,则直接将 0 作为结果返回即可。
  • 如果 num1和num 2都不是 0,则可以通过模拟「竖式乘法」的方法计算乘积。从右往左遍历乘数,将乘数的每一位与被乘数相乘得到对应的结果,再将每次得到的结果累加。这道题中,被乘数是 num 1,乘数是num2 。

需要注意的是,num2除了最低位以外,其余的每一位的运算结果都需要补 0。
在这里插入图片描述
然后对每次得到的结果(串)进行累加,就可以使用上一题字符串相加的方法。

class Solution {
public:string addStrings(string num1, string num2) {string str;str.reserve(max(num1.size(), num2.size()) + 1);int end1 = num1.size() - 1;int end2 = num2.size() - 1;int next = 0;while(end1 >= 0 || end2 >= 0){int x1 = end1 >= 0 ? num1[end1--] - '0' : 0;int x2 = end2 >= 0 ? num2[end2--] - '0' : 0;int x = x1 + x2 + next;next = x/10;x = x%10;//str.insert(str.begin(), x +'0');str += (x + '0');}if(next == 1){//str.insert(str.begin(), '1');str += '1';}reverse(str.begin(), str.end());return str;}string multiply(string num1, string num2) {if(num1 == "0" || num2 == "0")return "0";string ans = "0";int m = num1.size();int n = num2.size();for(int i = n - 1; i >= 0; i--){string cur;for(int j = n-1; j > i; j--)cur += '0';int next = 0;//进位int y = num2.at(i) - '0';for(int j = m-1; j >= 0; j--){int x = num1[j]-'0';int product = x *y + next;next = product / 10;product = product % 10;cur += (product + '0');}if(next != 0){cur += (next + '0');}reverse(cur.begin(), cur.end());ans = addStrings(ans,cur);}return ans;}
};

字符串转换整数

8.字符串转换整数(atoi)-力扣
在这里插入图片描述

函数 myAtoi(string s) 的算法如下:
空格:读入字符串并丢弃无用的前导空格(" ")
符号:检查下一个字符(假设还未到字符末尾)为 ‘-’ 还是 ‘+’。如果两者都不存在,则假定结果为正。
转换:通过跳过前置零来读取该整数,直到遇到非数字字符或到达字符串的结尾。如果没有读取数字,则结果为0。
舍入:如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被舍入为 −231 ,大于 231 − 1 的整数应该被舍入为 231 − 1 。
返回整数作为最终结果。

我们对题目要求依次求解即可:

  1. 对于空格,只需要用while条件判断删除即可。
  2. 对于符号,给定一个变量flag,初始化为1,判断如果有'-',就将其置为-1,有’+‘或者没有就还是为1,有’+‘或’-'加加跳过即可。
  3. 判断是否为数字字符,如果是才能进入循环,不是则直接退出。
  4. 数字字符 - ‘0’ = 数字,数字拼接:res = res *10 +flag*(c - '0');即可得到最终数字。
  5. 数字越界处理:在每轮数字拼接前判断res在此轮拼接后是否超过/小于 INT_MAX/INT_MIN ,若超过则直接返回INT_MAX/INT_MIN。

在这里插入图片描述

class Solution {
public:bool isdigital(char c){//判断是否是数字字符if(c >= '0' && c <= '9')return true;return false;}int myAtoi(string s) {int i = 0;int flag = 1;int res = 0;while(s[i]==' '){//去掉空格++i;}if(s[i]=='-')flag = -1;//记录负号if(s[i] == '-' || s[i] == '+')i++;int j = i;while(isdigital(s[j]) && j < s.size())//是数字字符再进循环{char c = s[j];//取出当前字符//判断越界if(res > INT_MAX /10 || (res == INT_MAX / 10 && (c-'0') > INT_MAX % 10))return INT_MAX;if(res < INT_MIN /10 || (res == INT_MIN / 10 && (c-'0') > -(INT_MIN % 10)))return INT_MIN;res = res *10 +flag*(c - '0');//拼接数字j++;}return res;}
};

感谢大家观看,如果大家喜欢,希望大家一键三连支持一下,如有表述不正确,也欢迎大家批评指正。
请添加图片描述

这篇关于【C++】string典型oj题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103670

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C++11的函数包装器std::function使用示例

《C++11的函数包装器std::function使用示例》C++11引入的std::function是最常用的函数包装器,它可以存储任何可调用对象并提供统一的调用接口,以下是关于函数包装器的详细讲解... 目录一、std::function 的基本用法1. 基本语法二、如何使用 std::function

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

poj2505(典型博弈)

题意:n = 1,输入一个k,每一次n可以乘以[2,9]中的任何一个数字,两个玩家轮流操作,谁先使得n >= k就胜出 这道题目感觉还不错,自己做了好久都没做出来,然后看了解题才理解的。 解题思路:能进入必败态的状态时必胜态,只能到达胜态的状态为必败态,当n >= K是必败态,[ceil(k/9.0),k-1]是必胜态, [ceil(ceil(k/9.0)/2.0),ceil(k/9.

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象