笔试练习day6

NC1 大数加法

大数加法_牛客题霸_牛客网 (nowcoder.com)

描述

以字符串的形式读入两个数字,编写一个函数计算它们的和,以字符串形式返回。

数据范围:𝑠.𝑙𝑒𝑛𝑔𝑡ℎ,𝑡.𝑙𝑒𝑛𝑔𝑡ℎ≤100000s.lengt**h,t.lengt**h≤100000,字符串仅由’0’~‘9’构成

要求:时间复杂度 𝑂(𝑛)O(n)

示例1

输入:

"1","99"

返回值:

"100"

说明:

1+99=100       

示例2

输入:

"114514",""

返回值:

"114514"

代码

#include <algorithm>
class Solution {
public:

    string add(string a,string b)
    {
        reverse(a.begin(),a.end());
        reverse(b.begin(),b.end());
        int k=0;
        string ret;
        int left=0;
        int right=0;

        while(left<a.size()||right<b.size())
        {

            if(left<a.size())k+=a[left++]-'0';
            if(right<b.size())k+=b[right++]-'0';

            ret+=k%10+'0';
            k=k/10;
        }
        if(k>0) ret+=k+'0';
        reverse(ret.begin(),ret.end());
        return ret;
    }
    string solve(string s, string t) {
        return add(s,t);
    }
};

NC40 链表相加(二)

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

描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。

给定两个这种链表,请生成代表两个整数相加值的结果链表。

数据范围:0≤𝑛,𝑚≤10000000≤n,m≤1000000,链表任意值 0≤𝑣𝑎𝑙≤90≤val≤9
要求:空间复杂度 𝑂(𝑛)O(n),时间复杂度 𝑂(𝑛)O(n)

例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

img

示例1

输入:

[9,3,7],[6,3]

复制

返回值:

{1,0,0,0}

复制

说明:

如题面解释     

示例2

输入:

[0],[6,3]

复制

返回值:

{6,3}

复制

备注:

1≤𝑛,𝑚≤1061≤n,m≤106
0≤𝑎𝑖,𝑏𝑖≤90≤ai,bi≤9

代码

class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    ListNode* reverse(ListNode* head) {
        if(head==nullptr || head->next==nullptr)
            return head;
        ListNode *a=nullptr, *b=head, *c=head->next;
        while(c!=nullptr) {
            b->next=a;
            a=b;
            b=c;
            c=c->next;
        }
        b->next=a;
        return b;
    }
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        ListNode* A=reverse(head1); //反转链表
        ListNode* B=reverse(head2); //反转链表
        ListNode* a=A, *b=B;
        int sum=0;
        ListNode* res=new ListNode(0);
        ListNode* cur=res;
        while(a!=nullptr || b!=nullptr || sum>0) {
            if(a!=nullptr) {
                sum+=a->val;
                a=a->next;
            }
            if(b!=nullptr) {
                sum+=b->val;
                b=b->next;
            }
            cur->next=new ListNode(sum%10);
            sum/=10;
            cur=cur->next;
        }
        cur=reverse(res->next);
        //释放额外空间
        delete res;
        //复原现场
        head1=reverse(head1);
        head2=reverse(head2);
        return cur;
    }
};

大数乘法

大数乘法__牛客网 (nowcoder.com)

class Solution {   
public:   
    string solve(string s, string t) {   
        reverse(s.begin(),s.end());   
        reverse(t.begin(),t.end());   
		//无进位相乘   
        vector<int> tmp(s.size()+t.size());   
        for(int i =0;i < s.size();i++)   
        {
            for(int j=0;j<t.size();j++)   
            {
                tmp[i+j] += (s[i]-'0')*(t[j]-'0');    
            }
        }
		//相加处理进位   
        int k=0;   
        string ret;   
        for(auto e:tmp)   
        {
            e+=k;
            ret+=e%10+'0';
            k=e/10;
        }
        while(k)
        {
            ret+=k%10+'0';
            k/=10;
        }
		//处理前导0
        while(ret.size()!=1&&ret.back()=='0')
        {
            ret.pop_back();
        }
        reverse(ret.begin(),ret.end());
        return ret;
    }
};

    {
            ret+=k%10+'0';
            k/=10;
        }
		//处理前导0
        while(ret.size()!=1&&ret.back()=='0')
        {
            ret.pop_back();
        }
        reverse(ret.begin(),ret.end());
        return ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值