• 【一天一道算法题】 两个字符串相乘


    最近在面试某大厂,跪在了最后一面技术面上。面试官要求带电脑,并在40分钟内当场完成一道题并要求跑通。

    题目是两个数字字符串相乘,得出的结果也用字符串输出。例如给string a = "123", string b = "456",求出结果字符串。

    回来仔细思考了一下,并在1小时内完成了这道题。

    思路如下:

    要计算123 * 456,可以模拟我们自己在进行乘法运算的过程,先计算6 * 123 = 738, 再计算5*123 = 615, 再计算4*123 = 492。

    最后再对三个字符串做移位相加。移位就是在后面补零。如果字符串还不相等,就在前面补0,知道两个字符串长度相等,再进行相加操作。

    代码如下:

    #include<iostream>
    #include<string>
    
    using namespace std;
    
    
    //单个字符与字符串相乘的结果
    string multiply(string a, char b)
    {
        int len = a.size();
        int i0 = 0, i1 = 0;
        int current;
        int temp = 0;
        string res;
        for(int i=len-1;i>=0;i--)
        {
            current = (a[i] - '0')*(b-'0') + temp;
            i0 = current%10; //个位
            i1 = current/10; //十位
            res = char(i0 + '0') + res;
            temp = i1;
        }
        if(i1!=0)
            res = char(i1 + '0') + res;
        return res;
    }
    
    //两个字符串错位相加
    string add(string a, string b, int b_shift)
    {
        string res;
        
        if(a.size() == 0)
            return b;
        for(int i=0;i<b_shift;i++)
            b = b + '0';
        
       
        int len_a = a.size();
        int len_b = b.size();
        int diff = len_a - len_b;
        if(diff>0)
        {
            for(int i=0;i<diff;i++)
                b = '0' + b;
        }
        else if(diff<0)
        {
            for(int i=0;i<abs(diff);i++)
            {
                a = '0' + a;
            }
        }
        
        int len = a.size();
        int current;
        int temp = 0;
        int i0 = 0, i1 = 1;
        for(int i=len-1;i>=0;i--)
        {
            current = a[i] - '0' + b[i] - '0' + temp;
            i0 = current%10;
            i1 = current/10;
            
            res = char(i0 + '0') + res;
            temp = i1;
        }
        if(i1>0)
            res = char(i1 + '0') + res;
        return res;
    }
    
    //两个字符串相乘
    string multiply(string a, string b)
    {
        int len_a = a.size();
        int len_b = b.size();
        
        string current;
        string res;
        for(int i=b.size()-1;i>=0;i--)
        {
            current = multiply(a, b[i]);
            res = add(res, current, b.size() - i -1);
        }
        return res;
    }
    int main()
    {
        string a = "98376";
        string b = "51209";
        string res = multiply(a, b);
        cout<<res<<endl;
    }

     其实题目本身并不难,说面试时紧张也好,同时平时编码少,说缺乏熟练度也好,总之跪在了最后一面。

    非常遗憾,今后仍需要加强编码。

  • 相关阅读:
    【爬虫】第一章:爬虫基础简介
    解决这个Address is invalid on local machine, or port is not valid on remote machine问题
    idea创建zuul网关实现过滤器入门实例
    Python面向对象之数据封装的应用及配置文件
    Python 并发编程(下)
    Python 内存管理与垃圾回收
    Python脚本生成可执行文件&(恋爱小脚本)
    Python 并发编程(上)
    UML类图的补充及软件设计原则
    Python 元类
  • 原文地址:https://www.cnblogs.com/corineru/p/11173245.html
Copyright © 2020-2023  润新知