链表以及字符串数据求和及乘积问题

news2024/11/17 7:54:42

 

目录

​编辑

<->本篇简介:

<二>题目解析解答:

2·1大数乘法问题:

①题目:

②思路汇总:

③解答代码: 

2·2 大数加法问题:

①题目:

②思路汇总: 

 ③解答代码:

2·3链表相加(二):

①题目:

 ②思路汇总:

③解答代码:

<三>做题总结:


<->本篇简介:

本篇文章分为三个部分也就是三道题来对一系列大数求和积问题做一下解答已经总结,这里正如题目所说的链表,字符串等,这些也不过是一个形式,其实可以归为一类,因此这里我们要知道真正的侧重点是在于如何去求和以及乘积?  这里也就是我们不能盲目的直接相加啊,相乘啊去求,因此可以把加以及乘的具体步骤模拟一下,最后得到最后答案,说白了也就是我们要一位一位来,而不是‘’一口气‘’!

因此下面我们就根据三道题来分析一下具体思路以及解法,一下是这三道题的链接,方便寻找,我们在这一起拿出(之后每个题目解答还会存在)。

大数乘法_牛客题霸_牛客网

大数加法_牛客题霸_牛客网

链表相加(二)_牛客题霸_牛客网

<二>题目解析解答:

2·1大数乘法问题:

①题目:

nowcoder链接:大数乘法_牛客题霸_牛客网 

②思路汇总:

思路:

首先根据num1和num2的位数确定要返回的字符串位数,开辟初始化好,然后把它拆分成num2的每一位从后往前与num1的数一位一位乘,故

这里用了num2嵌套num1的for循环。总结的规律:对应num1与num2里元素相乘得到的结果%放在ret数组的i+j+1位置,而/数放在i+j

位置,因此循环里可以套这个逻辑(而当算num2的十位与num1相乘的时候就要考虑加上对于ret数组位置上原先的数累加并进位了)

       

注:与正常相乘算法不同:这个是比如123*456:算出错位的738 就加上 后面算出的错位的 615.等到492算出再加上,是算一次就加上,而不是

最后一起加。

③解答代码: 

#include <iostream>
#include<string>
using namespace std;
string multiply(string num1, string num2) {
        if(num1=="0"||num2=="0")//一个零都为零
        {
            return "0";
        }
        int n1=num1.size();
        int n2=num2.size();
   string ret(n1+n2,'0');
     for(int i=n2-1;i>=0;i--){
        for(int j=n1-1;j>=0;j--){
            //由于如果是第一次可以不用,而后面的次数都要加上原先ret数组含有的值
            int re=(num2[i]-'0')*(num1[j]-'0')+(ret[i+j+1]-'0');//保存值,然后% /再放入对应数组
            ret[i+j+1]=re%10+'0';
           ret[i+j]= re/10+ret[i+j];//加减'0'抵消了

        }
     }
     //找是否存在开头有‘0’的情况
     string tmp;
     int count=-1;
     for(auto o:ret){
        if(o=='0'){
            count++;
        }
        else{
            break;
        }
     }
    if(count==-1){
        count=0;

        return ret;

    }

       tmp =ret.substr(count+1,n1+n2-count);
     return tmp;
     


    }

int main() {
   string s1;
   string s2;
   cin>>s1;
   cin>>s2;
   string ret= multiply(s1,s2);
   cout<<ret<<endl;
   return 0;

}
// 64 位输出请用 printf("%lld")

 

2·2 大数加法问题:

①题目:

 

nowcoder题目链接:大数加法_牛客题霸_牛客网 

②思路汇总: 

思路:栈+分步加法,这里由于可能一开始思路是直接转成整型或者longlong然后再相加,然而试过就知道了这种方法直接否掉了,因此我们可以借助一个栈的方法得到它的尾位然后依次保留商,依次与余数叠加放入新的栈,最后来个调整即可得到正确字符串,这里特别细的细节也没用,按着这样的思路就好。

下面介绍一下步骤汇总:

1.s与t分别遍历后放入两个栈里。

 2·分别取完栈顶元素后再pop然后完成一系列叠加操作,取余放入新栈。

 3·把新栈中的元素遍历出string中返回即可。

 

 ③解答代码:

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
        stack<char> s1, s2,ret;
        char top1='0',top2='0';
        int discuss = 0;
        for (int i = 0; i < s.size(); i++) s1.push(s[i]);
        for (int i = 0; i < t.size(); i++) s2.push(t[i]);
        while (!s1.empty() || !s2.empty() || discuss) {
            if (!s1.empty())  top1 = s1.top(); //这里不能pop,赋完值后pop

            if (!s2.empty())top2 = s2.top(); //这里不能pop,赋完值后pop



            int val1 = s1.empty() ? 0 : top1-'0';
            int val2 = s2.empty() ? 0 : top2-'0';
            if (!s1.empty()) s1.pop();
            if (!s2.empty()) s2.pop();


            int sum = val1 + val2 + discuss;
            discuss = sum / 10;
             ret.push(sum%10+'0');
            
        }
        string ans;
        while(!ret.empty()){
            ans+=ret.top();
            ret.pop();
        }
        return ans;

    }
};

 

2·3链表相加(二):

①题目:

 ②思路汇总:

思路:这里由于是从链表后面开始加故要么逆置链表要么借助栈容器先把它们各自入进去然后每次top加pop完成相加,余数入ret栈,保存商,方便下一次得到的余数相加,最后把分个的节点通过一次出栈的顺序连接起来。

 

细节问题:

    1· 可以接着叠加assert不能为0,如这种情况,即使两个栈都为空也要进行叠加:[5] [6];(叠加成立的是三个条件)

    2·不能保存top1或者top2就立马给它出栈,因为下面会根据判空来对val1和val2赋值操作,故要等赋完值后再pop。

 

③解答代码:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here

          stack<ListNode*>s1,s2,ret;
          ListNode* cur=nullptr;
          ListNode* top1=nullptr;
          ListNode* top2=nullptr;
          ListNode*cur1=head1;
          ListNode*cur2=head2;
          int discuss=0;
   //入栈:
          while(cur1){
            s1.push(cur1);
            cur1=cur1->next;
          }
           while(cur2){
            s2.push(cur2);
           
            cur2=cur2->next;
          }
    
    //对应节点的val相加操作:
          while(!s1.empty()||!s2.empty()||discuss){
            if(!s1.empty())  top1=s1.top();//这里不能pop,赋完值后pop
            
           if(!s2.empty())top2=s2.top();//这里不能pop,赋完值后pop
          
            
           
            int val1=s1.empty()?0:top1->val;
            int val2=s2.empty()?0:top2->val;
            if(!s1.empty()) s1.pop();
            if(!s2.empty()) s2.pop();

          
            int sum=val1+val2+discuss;
            discuss=sum/10;
          
           cur=new ListNode(sum%10);
           ret.push(cur);

          }
          //最后结果链表的组合:
          cur=ret.top();
          ListNode*fans=cur;
          ret.pop();
          while(!ret.empty()){
            ListNode*top3=ret.top();
            ret.pop();
            cur->next=top3;
            cur=top3;
          }
       return fans;

    }
};

<三>做题总结:

仅个人理解:这里比如说像上面的字符串,链表节点等求和,积,其实这不是重点,重点是对加法和乘法要怎么操作?——>这里我认为大致分为两类:

1·就是求加法(当然这里不能直接求):这里一般就是给你一组数(先不要管是啥类型),肯定是从末尾到前,这么对应加,因此这里引用了栈,完成一系列操作。所以只要是加法我们可以优先考虑一下栈。

2·就是乘法:乘法我们要知道它可以理解为“加法的升级”,怎么解释呢? 它就相当于加法然后还要错位相加一次,因此我们这里可以转化成每次一位数(i处)乘完另一个数各个位,然后与下面i+1处的再次重复,接下来不就是个加法操作(只不过错位了),因此这里可以借助一个数组(初始化0),大小就是这两位数size之和,如(999*999不就最长也就是六位数嘛)。因此再来两个for循环嵌套,相乘后模放到i+j+1位置也就是对应那个开辟数组的相应位置(当然也要加上原来此位置上的值),此时我们得到的就是总和,然后取余放到它的前一位也就是i+j(当然一开始对应的是0,但是错位相乘的时候就不是零了,因此我们还要加上原来这里的值,这也算一个细节吧),最后遍历完,然后消除前置零即可了,故概括为开辟数组根据下标判断位置映射过去,最后去无关0即可。

 

如有错误或不详细地方欢迎各位大佬留言指导. 

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

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

相关文章

【数据结构中的哈希】

泛黄的春联还残留在墙上.......................................................................................................... 文章目录 前言 一、【哈希结构的介绍】 1.1【哈希结构的概念】 1.2【哈希冲突】 1.3【哈希函数的设计】 1.4【应对哈希冲突的办法】 一、…

PostgreSQL 一张表多个字段关联另一张表

event_catalog 表 event 表 sql SELECT event.event_uuid, event.event_case_id, event.event_status, event.event_catalog_1, event.event_catalog_2, event.event_catalog_3, event.event_title, event.event_content, event.event_source, event.event_purpose, event.eve…

JZ2440开发板——使用S3C2440操作Nand Flash

以下内容源于韦东山课程的学习与整理&#xff0c;如有侵权请告知删除。 本篇文章涉及以下文档资料&#xff1a;S3C2440数据手册、Nand Flash数据手册&#xff08;有三份&#xff0c;看K9F2G08U0C即可&#xff09;、JZ2440开发板原理图。 一、JZ2440上的Nand Flash JZ2440开发…

部署wordpress项目

一、先部署mariadb 二、在远程登录工具上进行登录测试&#xff0c;端口号为30117&#xff0c;用户为 root&#xff0c;密码为123 三、使用测试工具&#xff1a; [rootk8s-master aaa]# kubectl exec -it pods/cluster-test0-58689d5d5d-7c49r -- bash 四、部署wordpress [root…

楼上还是楼下的暖气,谁家更好蹭?

前几天收到个私信&#xff0c;想了解楼上楼下哪一户开暖气对中间影响大。我看到后就想&#xff0c;妙啊&#xff0c;这样就不需要开暖气&#xff0c;让邻居家的热气传过来&#xff0c;得省多少取暖费&#xff1f;不过站在热力学的角度&#xff0c;我们今天就来研究一下这个问题…

Xcode报错:The request was denied by service delegate (SBMainWorkspace)

Xcode报错&#xff1a;The request was denied by service delegate (SBMainWorkspace) 造成的原因: &#xff08;1&#xff09;新的M2芯片的Mac电脑 (2) 此电脑首次安装启动Xcode的应用程序 (3&#xff09;此电脑未安装Rosetta 解决方法: &#xff08;1&#xff09;打开终端…

电商IM客服系统的主要功能 网站即时通讯软件源码or SaaS

电商IM客服系统在现代电商平台中扮演着至关重要的角色&#xff0c;提供了高效的客户服务解决方案。系统的多功能特性使其能够实时响应客户需求&#xff0c;解决问题并增加转化率。以下是电商IM客服系统的六大功能 1、实时在线聊天&#xff1a;支持顾客与客服实时沟通&#xff0…

php thinkphp 小程序发送订阅模板消息通知

小程序需要在我的模板中先选用模板 小程序需要先订阅模板 wx.requestSubscribeMessage({tmplIds: ["XII_0By8D9WabnUjVPB_8S1itsm2d4_xxx"],success:

C++:string类写时拷贝|引用计数

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 写时拷贝&#xff08;了解&#xff09; 参考博客&#xff1a;C写时拷贝的不同方案&…

前台项目启动/打包报错 Error: error:0308010C:digital envelope routines::unsupported

在package.json中修改启动/打包语句 如图&#xff0c;我这里是打包时候报错&#xff0c;就在build里前面加上 set NODE_OPTIONS--openssl-legacy-provider && 再次打包&#xff0c;成功。

了解HTTPS

目录 1.HTTP认识 2.HTTP请求 3.HTTP响应 4.URL 5.HTTP方法 面试题&#xff1a;POST 和 GET区别&#xff1f; 网上关于 GET 与 POST的差别 有待商议 关于请求报头 和 响应报头 6..Host &#xff1a; 7..USer-Agent&#xff08;简称UA&#xff09; 8.状态码 9.HTTPS 是…

使用Charles抓包Android App数据

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 抓包环境准备 1. 下载安装charles charles下载地址&#xff1a;https://www.charlesproxy.com/latest-release/download.do 2. SSL代理设置 3. http代理和…

七段 LED 显示器(7段数码管)

7 段 LED 显示器, 通常简称为 LED 数码管 或 数码管. 通过 菜单--绘制--数字芯片--添加 7 段 LED 显示器 可以引入它. 普通模式 它内部其实就是七盏长条状的 LED 灯, 有的横着放, 有的竖着放. 七个灯用 a b c d e f g 分别表示. 灯的位置从上到下, 从里到外顺时针下来, 如上图…

240925-GAN生成对抗网络

GAN生成对抗网络 GAN&#xff0c;顾名思义&#xff0c;gan……咳咳&#xff0c;就是干仗嘛&#xff08;听子豪兄的课讲说这个名字还真的源于中文这个字&#xff09;&#xff0c;对应的就有两方&#xff0c;放在这里就是有两个网络互相对抗互相学习。类比武林高手切磋&#xff…

iPhone手机备忘录如何克隆到其他手机?

很多苹果用户喜欢使用备忘录记事&#xff0c;它不仅方便用户记录日常事务&#xff0c;还能存储灵感和重要信息。然而&#xff0c;当用户需要更换手机时&#xff0c;尤其是跨系统更换&#xff0c;备忘录内容的迁移便成了一个难题。 为了解决这一问题&#xff0c;用户可以选择使…

亚马逊新手运营如何变优秀?——把简单的事情复杂化!

众所周知&#xff0c;电商运营的基本逻辑看似简单&#xff1a;流量、转化率和利润率的结合等于盈利。然而&#xff0c;这个等式背后隐藏的复杂性常常让新手运营者感到困惑。 他们可能会发现&#xff0c;尽管他们努力增加流量、提高转化率和调整利润率&#xff0c;但仍然无法实…

【可见的点——欧拉函数】

在数论&#xff0c;对正整数n&#xff0c;欧拉函数是小于或等于n的正整数中与n互质的数的数目&#xff08;不包括1&#xff09; 题目 思路 有三个点比较特殊&#xff08;因为一来这三个点一定可见&#xff0c;同时也无法用gcd 1判断&#xff09;&#xff1a;&#xff08;0&am…

自己偷偷玩!(NSFW)无内容审查大模型推荐

大家好&#xff0c;我是画画的小强 今天给大家推荐几个(NSFW)无内容审查的大模型&#xff0c;可以让你部署在本地电脑运行&#xff01; CausalLM-14B CausalLM-14B 是基于阿里通义实验室的大模型 Qwen-14B 加入其他中文数据集训练而来&#xff0c;经过量化和 DPO 算法的重构…

2025台球展,2025河南台球及配套设施展览会3月举办

阳春三月&#xff0c;年度招商季&#xff0c;壹肆柒中国国际台球产业博览会助力全国台球企业拓市场&#xff1b; 2025中国&#xff08;郑州&#xff09;国际台球产业博览会&#xff08;壹肆柒台球展&#xff09; The 2025 China (Zhengzhou) International Billiards Industry…

朋友圈内容折叠全解析:原因与对策

你是否遇到过精心编写的朋友圈动态被微信自动折叠成一行&#xff0c;甚至出现“叠中叠”现象&#xff0c;多条动态被压缩在一起&#xff1f;这种情况被称为“朋友圈折叠”&#xff0c;它影响着信息的曝光率和互动性。为了帮助你更好地管理朋友圈内容&#xff0c;我将为你详细解…