【C++】 —— 笔试刷题day_6

刷题day_6,继续加油哇!

今天这三道题全是高精度算法

一、大数加法

题目链接:大数加法

题目解析与解题思路

在这里插入图片描述

OK,这道题题目描述很简单,就是给我们两个字符串形式的数字,让我们计算这两个数字的和

看题目我们可以发现,题目所给的数组范围特别大,所以,我们使用int、long long肯定是不行的;

对于这种高精度算法题,我们解题思路呢也很简单,就直接模拟加法(加法竖式)就可以了。

怎么模拟呢?(这里自己给出两个数字,来模拟一下过程)

现在自己给出两个字符串1314521

我们来模拟一下这两个数字求和的过程

在这里插入图片描述

我们通过观察可以发现,在列竖式计算时:当前位的结果等于两个数当前位的和再加上进位数,(而进位数等于上一位的结果/10)最后再%10

那我们就可以来模拟整个过程了:

这里有两种思路:

一就是先将字符串中的每一位转化成int并存储起来,再进行计算,最后转化成string结果返回

这种思路也是博主在做这道题时用的思路,实现起来并不算特别麻烦;

但是有一点,需要为st和结果ret创建三个int类型的数组。

这里就不实现这一种思路了,来看第二种思路

第二种思路也是模拟整个过程,但是不需要创建数组来存储数据,直接从字符串的最后一位开始计算,结果直接存放在ret要返回的string中,直到结束

在整个过程中,我们需要注意:

  • 计算结果是通过push_back()尾插到结果中,所以在结果中个位是在前面的,在返回之前我们需要对其进行逆置。

代码实现

class Solution {
public:string solve(string s, string t) {// write code hereint i = s.size() - 1;int j = t.size() - 1;string ret;int tmp = 0;//进位数while(i>=0 || j>=0 ||tmp){if(i>=0)tmp+=(s[i--]-'0');if(j>=0)tmp+=(t[j--]-'0');ret+=(tmp%10 +'0');tmp/=10;}reverse(ret.begin(),ret.end());return ret;}
};

二、链表相加

题目链接:链表相加

题目解析

在这里插入图片描述

来看这一道题目,给我们两个单链表(9->3->76->3)每一个链表代表一个整数,让我们计算这两个链表所代表整数的和。

当然这一道题看起来和上一题类似,解法也类似,只不过多了一些链表的相关操作。

算法思路

我们通过题目给的示例可以发现,数字的最低位是在链表的结尾;

我们计算的时候都是从最低位开始计算的,所以本道题需要先将链表进行逆置再进行操作

整体思路如下:

  • 首先将链表逆置。
  • 再同时遍历两个逆置后的链表,计算结果,一位一位的头插到结果链表中。
  • 最后返回结果链表即可。

这里解释一下为什么要用头插:因为我们是从个位开始计算的,而个位应该在链表的尾部,所以使用头插;就避免了使用尾插后再进行逆置链表。

逆置链表:

之前我们逆置链表是使用两个指针来逆置,这个就不多说了;

现在来看一种新的逆置方法

  1. 先定义一个链表的头节点,
  2. 再遍历原链表,将原链表的节点头插到定义的新链表中,
  3. 最后遍历结束,头结点的下一个节点就是逆置完的链表的第一个节点。

代码实现

现在来看代码实现:(当然这里也可以现将所以数取出来再进行计算)

/*** struct ListNode {*  int val;*  struct ListNode *next;*  ListNode(int x) : val(x), next(nullptr) {}* };*/
class Solution {public:ListNode* reverse(ListNode* head) {ListNode* phead = new ListNode(0);ListNode* cur = head;while (cur) {//头插法逆置链表ListNode* next = cur->next;cur->next = phead->next;phead->next = cur;cur = next;}ListNode* ret = phead->next;delete phead;return ret;}ListNode* addInList(ListNode* head1, ListNode* head2) {// write code herehead1 = reverse(head1);head2 = reverse(head2);int tmp = 0;ListNode* head = new ListNode(0);while (head1 != nullptr || head2 != nullptr || tmp) {if (head1) {tmp += head1->val;head1 = head1->next;}if (head2) {tmp += head2->val;head2 = head2->next;}int x = tmp % 10;ListNode* newnode = new ListNode(x);newnode->next = head->next;head->next = newnode;tmp /= 10;}ListNode* ret = head->next;delete head;return ret;}
};

三、大数乘法

题目链接:大数乘法

题目解析

在这里插入图片描述

这道题就有意思了,大数乘法,前两道我们都是算的加法,现在来看乘法;

给定字符串,计算这两个字符串对应的乘积;

算法思路

看到这道题,多多少少还是有那么一点思路的,我们还是需要模拟整个乘法的过程;

乘法呢,我们知道,一个数的每一位都要和另一个数去乘的,所以这里我们使用两层for循环就可以解决问题。

但是新的问题又来了,那就是个位、十位和百位与另一个数乘是不一样的;那乘完之后将数放到哪里呢?

这里定义一个vector,大小是m+nmn分别表示两个字符串的长度)。

我们现将两个字符逆置过来,这样个位所对应的下标就是0、十位就是1

所以我们在计算乘的时候(一个数的个位与另一个数的每一位相乘)所得的积就要放在vector[i+j]中,什么意思呢?

在这里插入图片描述

可以看到,这样我们就知道了两个数的每一位相乘需要放到哪一个位置上了。

这里注意,我们在第一次计算的过程中最好不要进位(因为太麻烦了)

  • 这里计算完成以后(不进位),我们遍历整个vector数组,将其中的数依次进位,然后转换成字符;
  • 注意:遍历完vector数组后,可能存在进位未转换,需要单独处理
  • 最后,我们需要对字符串进行一个去0操作,就是将最高位的0去掉
  • 再逆置一下即可

代码实现

class Solution {
public:string solve(string s, string t) {// write code herereverse(s.begin(),s.end());reverse(t.begin(),t.end());int m = s.size();int n = t.size();vector<int> v(m+n,0);//不进位计算for(int i=0;i<m;i++){for(int j = 0;j<n;j++)v[i+j] += (s[i]-'0')*(t[j]-'0');}//处理进位int tmp = 0;string ret;for(auto e:v){tmp+=e;ret+=(tmp%10 + '0');tmp/=10;}//进位可能有余while(tmp){ret+=(tmp%10 + '0');tmp/=10;}//对最高位进行去0while(ret.size()>1 && ret.back()=='0')ret.pop_back();reverse(ret.begin(),ret.end());return ret;}
};

这三道高精度的算法题,希望对你有所帮助!

感谢支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

todolist docker 小工具

参考链接 前排提示 没有中文&#xff0c;可使用浏览器 翻译 前提 安装docker安装docker-compose 下载仓库 git clone https://github.com/JordanKnott/taskcafe进行安装 cd taskcafe docker-compose -p taskcafe up -d服务启动后会监听在 3333 端口上&#xff0c;通过浏览器…

Unity--GPT-SoVITS接入、处理GPTAPI的SSE响应流

GPT-SoVITS GPT-SoVITS- v2&#xff08;v3也可以&#xff0c;两者对模型文件具有兼容&#xff09; 点击后 会进入新的游览器网页 ----- 看了一圈&#xff0c;发现主要问题集中在模型的训练很需要CPU&#xff0c;也就是模型的制作上&#xff0c;问题很多&#xff0c;如果有现有…

《TypeScript 快速上手:类型、编译与严格模式的简明教程》

一、TypeScript介绍 在引入编程社区 20 多年后&#xff0c;JavaScript 现在已成为有史以来应用最广泛的跨平台语言之一。JavaScript 最初是一种用于向网页添加微不足道的交互性的小型脚本语言&#xff0c;现已发展成为各种规模的前端和后端应 用程序的首选语言。虽然用 JavaSc…

ROS2 系统架构

1.操作系统层 ros2是基于Linux、Windows、macOS系统建立的&#xff0c;这一层为ros2提供了各种基础的硬件驱动&#xff0c;比如网卡驱动&#xff0c;常用USB驱动和常用摄像头驱动等。 2.DDS实现层 ros2的核心通信是采用第三方的通信组件来实现的&#xff0c;这个第三方就是数…

【HTML】二、列表、表格

文章目录 1、列表1.1 无序列表1.2 有序列表1.3 定义列表 2、表格2.1 定义2.2 表格结构标签2.3 合并单元格 1、列表 列表分为&#xff1a; 无序列表有序列表定义列表&#xff1a;一个标题下有多个小分类 1.1 无序列表 ul嵌套li&#xff0c;ul是无序列表&#xff0c;li是列表…

redis zset基本介绍以及底层实现

ZSet&#xff08;Sorted Set&#xff09;有序集合 介绍 Redis 中的有序集合(Sorted Set)是在集合(Set)的基础上,为每个成员关联了一个分数(score)。这个分数可以用来对集合中的成员进行排序。 有序集合保留了集合不能有重复成员的特性&#xff08;成员不能重复&#xff0c;分值…

政策助力,3C 数码行业数字化起航

政策引领&#xff0c;数字经济浪潮来袭 在当今时代&#xff0c;数字经济已成为全球经济发展的核心驱动力&#xff0c;引领着新一轮科技革命和产业变革的潮流。我国深刻洞察这一发展趋势&#xff0c;大力推进数字化经济发展战略&#xff0c;为经济的高质量发展注入了强大动力。 …

IntelliJ IDEA 快捷键系列:重命名快捷键详解

目录 引言一、默认重命名快捷键1. Windows 系统‌2. Mac 系统‌ 二、操作步骤与技巧1. 精准选择重命名范围‌2. 智能过滤无关内容‌ 三、总结 引言 在代码重构中&#xff0c;‌重命名变量、类、方法‌ 是最常用的操作之一。正确使用快捷键可以极大提升开发效率。本文针对 ‌Ma…

文档搜索引擎

首先获取很多网页(爬虫->一个http客户端,发送http请求获取http响应结果(就是网站))(批量化的获取很多的页面) 再根据用户输入的查询词,在网页中进行查找 用户输入查询词之后,如何让查询词和当前这些网页进行匹配 ->使用倒排索引 倒排索引 1.文档: 每个待搜索的网页(被爬…

开源工具利器:Mermaid助力知识图谱可视化与分享

在现代 web 开发中&#xff0c;可视化工具对于展示流程、结构和数据关系至关重要。Mermaid 是一款强大的 JavaScript 工具&#xff0c;它使用基于 Markdown 的语法来呈现可定制的图表、图表和可视化。对于展示流程、结构和数据关系至关重要。通过简单的文本描述&#xff0c;你可…

C# --- LINQ

C# --- LINQ 什么是LINQFluent Syntax 和 SQL-Like QueryLINQ Operations 什么是LINQ LINQ的全称为Language Integrated Query, 为各种查询(包括对象查询&#xff0c;数据库查询&#xff0c;XML查询) 提供了统一模型.LINQ源于SQL&#xff0c;但比SQL更加强大&#xff0c;更加灵…

【AI News | 20250316】每日AI进展

AI Repos 1、ReActMCP 将网络搜索能力集成到AI助手中的一个MCP服务&#xff1a;ReActMCP Web Search&#xff0c;相当于给AI装了个搜索引擎&#xff0c;可以实时查找最新的内容。它基于Exa API执行基本和高级网络搜索&#xff0c;高级搜索比如限制搜索的网站范围、指定日期范围…

【VUE】day04-组件的生命周期、组件之间的数据共享、ref引用、购物车案例

【VUE】day04-组件的生命周期、组件之间的数据共享、ref引用、购物车案例 1. 组件之间的关系2. 使用组件的三个步骤3. vue.components全局注册组件4. 自动生成右边标签插件5. 组件的props6. 结合v-bind使用自定义属性7. props的默认default值8. type值类型9. 组件之间的样式冲突…

Redis分布式锁深度剖析:从原理到Redisson实战,破解脑裂与高并发锁难题

一、&#x1f4cc; 分布式锁的核心应用场景 场景类型典型案例风险说明&#x1f680; 高并发场景电商秒杀、票务抢购库存超卖风险⏰ 定时任务场景集群日志清理、数据统计任务重复执行&#x1f504; 幂等场景支付接口重试、订单创建资金重复扣款 二、&#x1f527; Redis分布式锁…

量化交易学习笔记02:双均线策略

双均线策略示例 个股&#xff1a;中国平安 回测日期&#xff1a;2022-5-1至2023-5-1 短均线&#xff1a;5天 长无线&#xff1a;10天 代码&#xff1a; def initialize(context):# 初始化此策略# 设置我们要操作的股票池, 这里我们只操作一支股票# """标的&qu…

交换机控制软件的实现步骤猜测

一、主要目的 提出对交换机软件控制逻辑的猜测。 二、交换机控制软件的组成 (一)背景 1、交换机有很多的RJ45水晶头端口。 2、每个端口支持同时发送和接收字节数据。 3、每个端口接收的数据需要查表后才能转发给目标端口。 (二)端口状态扫描线程 负责扫描每个端口的状态&#x…

Part1:基于国内源完成Kubernetes集群部署

集群规划 操作系统&#xff1a;CentOS7 内核版本&#xff1a;5.4&#xff08;需升级&#xff09; 组件版本说明操作系统内核5.4RPM方式升级docker26.1.4yum安装cri-docker0.3.16二进制安装kubeadm1.30.11yum安装kubealet1.30.11yum安装kubectl1.30.11yum安装kubectl1.30.11yu…

中考英语之10难点单词

A abandon ~动词&#xff0c;意为 “抛弃&#xff1b;放弃”。 ~例如 He abandoned his old bike by the roadside.&#xff08;他把他的旧自行车扔在路边。&#xff09; absolute ~形容词&#xff0c;“绝对的&#xff1b;完全的”。 ~例如 We have absolute trust in him…

【GPT入门】第24课 langfuse介绍

【GPT入门】第24课 langfuse介绍 1. langfuse概念与作用2. 代码3. 页面效果4. 设计模式1. 装饰器模式2. 上下文管理模式1. langfuse概念与作用 Langfuse是一款专为大规模语言模型(LLM)应用开发设计的开源平台。其作用主要包括以下几个方面: 提升开发效率:通过消除LLM应用构…

在 React 中使用 Web Components 的实践操作

前言 在现代前端开发中&#xff0c;React 和 Web Components 都是广泛使用且备受欢迎的技术。React 是一个用于构建用户界面的 JavaScript 库&#xff0c;提供了组件化的开发方式和高效的状态管理&#xff0c;而 Web Components 是一套原生的浏览器技术标准&#xff0c;允许开…