【LeetCode 43】字符串相乘

 方法一

    public static String multiply(String num1, String num2) {
    	String ret = "";
    	int n1 = num1.length(); 
    	int n2 = num2.length(); 
    	// use num2 to multiply num1
    	if (n1 < n2)
    	{
    		String tmp = num1;
    		num1 = num2;
    		num2 = tmp;
    		n1 = num1.length();
    		n2 = num2.length();
    	}
    	
    	int k = 0;
    	for (int j = n2-1; j >= 0; j--)
    	{
    		String s = mul(num1, num2.charAt(j), k);
    		ret = add(ret, s);
    		k++;
    	}
    	return ret;
    }
    
    
    private static String mul(String number, char c, int k) // k represent the position of c
    {
    	String ret = "";
    	Deque<Integer> stack = new ArrayDeque<Integer>();
    	while (k-- > 0)
    	{
    		stack.push(0);
    	}
    	int carry = 0;
    	int remainder = 0;
    	for (int i = number.length()-1; i >= 0; i--)
    	{
    		int tmp = (number.charAt(i) - '0') * (c - '0') + carry;
    		carry = tmp / 10;
    		remainder = tmp % 10;
    		stack.push(remainder);
    	}
    	if (carry != 0)
    		stack.push(carry);
    	if (!stack.isEmpty())
    	{
    		int n = stack.peek();
    		if (n == 0)
    			return "0";
    	}
    		
    	while (!stack.isEmpty())
    	{
    		int num = stack.pop();
    		ret += num + "";
    	}
    	return ret;
    }
    
    private static String add(String n1, String n2)
    {
    	String ret = "";
    	Deque<Integer> stack = new ArrayDeque<Integer>();
    	int i = n1.length() - 1;
    	int j = n2.length() - 1;
    	int carry = 0;
    	int remainder = 0;
    	while (i >= 0 && j >= 0)
    	{
    		int tmp = n1.charAt(i) - '0' + n2.charAt(j) - '0' + carry;
    		carry = tmp / 10;
    		remainder = tmp % 10;
    		stack.push(remainder);
    		i--;
    		j--;
    	}
    	while (i >= 0)
    	{
    		int tmp = n1.charAt(i) - '0' + carry;
    		carry = tmp / 10;
    		remainder = tmp % 10;
    		stack.push(remainder);
    		i--;
    	}
    	while (j >= 0)
    	{
    		int tmp = n2.charAt(j) - '0' + carry;
    		carry = tmp / 10;
    		remainder = tmp % 10;
    		stack.push(remainder);
    		j--;
    	}
    	if (carry != 0)
    		stack.push(carry);
    	while (!stack.isEmpty())
    	{
    		int num = stack.pop();
    		ret += num + "";
    	}
    	return ret;
    }

 方法二
 参考题解,相比于方法一,这个方法仅仅对数字做了一次进位修正,而不是在乘法和加法都进行修正,思路是相同的。

	public static String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        
        int m = num1.length(), n = num2.length();
        
        int[] ansArr = new int[m + n];
        for (int i = m - 1; i >= 0; i--) {
            int x = num1.charAt(i) - '0';
            for (int j = n - 1; j >= 0; j--) {
                int y = num2.charAt(j) - '0';
                ansArr[i + j + 1] += x * y; // 从最低位开始填写数字 最低位: m+n-1 -> m-1 + n-1 + 1,相当于对应位置数字相加,可以巧妙的使得对应位置的数字相加,第二步再对相应的数字进行修改
            }
        }
        
         // 对每一个计算结果进行修正
        for (int i = m + n - 1; i > 0; i--) {
            ansArr[i - 1] += ansArr[i] / 10; 
            ansArr[i] %= 10;
        }
        
        int index = ansArr[0] == 0 ? 1 : 0;
        StringBuffer ans = new StringBuffer();
        while (index < m + n) {
            ans.append(ansArr[index]);
            index++;
        }
        return ans.toString();
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值