• lc 字符串相乘


    链接:https://leetcode-cn.com/explore/interview/card/bytedance/242/string/1015/

    代码:

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    class Solution {
    public:
        string multiply(string num1, string num2) {
            // cout <<  to_string(34) << endl;
            // string str = "34";
            // cout << stoi(str) << endl;
            if(num1 == "" || num2 == "") return "";
            if(num1 == "0" || num2 == "0") return "0";
            int len1 = num1.size();
            int len2 = num2.size();
            string temp_s1 = num1;
            string res = "0";
            for(int i = len2-1; i >= 0; i--) {
                int temp = int(num2[i]) - 48;
                while(temp--) {
                    res = add(res, temp_s1);
                    res = normalize(res);
                }
                temp_s1 += "0";
            }
            return res;
        }
        string add(string num1, string num2) {
            int len1 = num1.size();
            int len2 = num2.size();
            int len = max(len1, len2);
            string s1 = add_zero(num1, len+1);
            string s2 = add_zero(num2, len+1);
            // cout << s1 << " " << s2 << endl;
            string res = "";
            for(int i = len; i >= 0; i--) {
                res += "0";
            }
            // cout << res << endl;
            int carry[500] = {0};
            for(int i = len; i >= 0; i--) {
                int n1 = int(s1[i])-48;
                int n2 = int(s2[i])-48;
                // cout << n1 << " " << n2 << endl;
                if(carry[i] + n1 + n2 < 10) {
                    res[i] = char(carry[i]+n1+n2+48);
                }
                else {
                    // res[0] < 1 so i-1 is valid
                    // cout << i << endl;
                    carry[i-1] = 1;
                    res[i] = char((carry[i]+n1+n2) % 10 + 48);
                }
            }
            // cout << res << endl;
            return res;
        }
        string add_zero(string num, int len) {
            int len_num = num.size();
            int loop = len - len_num;
            string res = "";
            while(loop--) {
                res += "0";
            }
            res += num;
            return res;
        }
        string normalize(string num) {
            if(num.size() == 1) return num;
            if(num[0] != '0') return num;
            else {
                string res = "";
                for(int i = 1; i < num.size(); i++) {
                    res += num[i];
                }
                return res;
            }
        }
    };
    View Code

    思路:normalize掉有前置 0 的,乘法不过是特殊的加法,模拟就好,将短长 string 都补齐到 max_len+1的长度,再设置数组 carry 考虑进位问题。

  • 相关阅读:
    数据库索引的作用和长处缺点
    ping不通的几种可能原因
    UVA
    strtok、strtok_s、strtok_r 字符串切割函数
    CheckBoxPreference组件
    EM算法原理
    Android中ExpandableListView控件基本使用
    拓扑排序的原理及事实上现
    DropdownList绑定的两种方法
    leetcode第一刷_Length of Last Word
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/12907874.html
Copyright © 2020-2023  润新知