leetcode 43.字符串相乘【字符串、数组】

  1. 方法1
    将num2中每个数字依次与num1相乘,得到num2.length()个字符串,然后再将这些数字求和即可。
class Solution {
    public String multiply(String num1, String num2) {
        int len1 = num1.length();
        int len2 = num2.length();
        //对特殊情况的提前处理
        if(len1==0 || len2 ==0){
            return null;
        }
        if("0".equals(num1) || "0".equals(num2))return "0";
        
        //创建一个数组用于记录num2中每个数字与num1相乘的结果,数组长度为num2字符串的长度
        StringBuilder[] sb = new StringBuilder[len2];
        for (int k = 0; k< len2; k++) {
			sb[k] = new StringBuilder();
		}
        for(int i=len2-1; i>=0; i--){
        //从num2的第最后一个数字,即个位数开始计算
            int carry = 0;
            int index = i;
            for(int j=len1-1; j>=0; j--){
            //遍历num1字符串,用第num2中的第i个数字与num1中的所有数字相乘,当num2不是个位时,需要先补0,
                while(index<len2-1){
                    sb[i].append("0");
                    index++;
                }
                int ans = (num1.charAt(j)-'0') * (num2.charAt(i)-'0') + carry;
                sb[i].append(ans%10);
                //判断是否有进位
                if(ans/10>0){
                    carry = ans /10 ;
                }else{
                    carry = 0;
                }
            }
            //这里要特别注意,每计算完num2中的一个数字后,都需要判断是否还存在进位
            if(carry != 0){
                sb[i].append(carry);
            }
        }
        //记录最长的元素个数,以此为基础对每个元素的对应位相加
        int maxlen = sb[0].length();
        StringBuilder ans = new StringBuilder();
        int car = 0;
        //经过乘法计算后,sb数组每个元素的第0位为个位,依次将sb中每个元素的对应位置的数字相加
        for(int i=0; i<maxlen; i++){
            int res=0;
            for(int j=0; j<len2; j++){
            //当元素中数字个数不足时,跳过此步
                if(i < sb[j].length()){
                    res =res + (sb[j].charAt(i)-'0');
                }
            }
            res+=car;
            ans.append(res%10);
            //判断进位
            if(res/10 > 0){
                car = res/10;
            }else{
                car=0;
            }
        }
        //这里特别注意,计算完所有数字后还需要判断是否有进位
        if(car != 0)
            ans.append(car);
        //将字符串反转
        return ans.reverse().toString();
    }
}
  1. 方法2:
    参考下图:
    https://leetcode-cn.com/problems/multiply-strings/solution/you-hua-ban-shu-shi-da-bai-994-by-breezean/
    分别计算两个字符串中的每位数字相乘的结果,并利用下标的关系对其结果进行保存,保存在一个总长在num1.length()+num2.length()的数组中。
    参考答案区大佬的代码,该方法比较难直接想出来,对进位的处理非常巧妙。
class Solution {
    public String multiply(String num1, String num2) {
        //对特殊情况的提前处理
        if(len1==0 || len2 ==0){
            return null;
        }
        if("0".equals(num1) || "0".equals(num2))return "0";
        //两数相乘,结果最大长度为两数长度之和
        int[] res = new int[num1.length() + num2.length()];
        
        for (int i = num1.length() - 1; i >= 0; i--) {
        //取num1的个位数
            int n1 = num1.charAt(i) - '0';
            for (int j = num2.length() - 1; j >= 0; j--) {
            //从个位数开始遍历num2,分别于n1相乘
                int n2 = num2.charAt(j) - '0';
                //结果个位数对应的历史数值相加
                int sum = (res[i + j + 1] + n1 * n2);
                //求个位数数值
                res[i + j + 1] = sum % 10;
                //结果/10再与该位历史数值相加,过程中可能存在>10的数值
                res[i + j] += sum / 10;
            }
        }
        
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < res.length; i++) {
        //最高位可能为0,去除
            if (i == 0 && res[i] == 0) continue;
            result.append(res[i]);
        }
        return result.toString();
    }
}

发布了55 篇原创文章 · 获赞 0 · 访问量 793

猜你喜欢

转载自blog.csdn.net/er_ving/article/details/104673817
今日推荐