43.字符串相乘

题目如下:

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

说明:

  1. num1 和 num2 的长度小于110。
  2. num1 和 num2 只包含数字 0-9
  3. num1 和 num2 均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理

直接上代码了,效率不怎么高,java算法优化自己还不太了解,有待学习,希望自己先渐渐训练出严谨的思维。

class Solution {
    public String multiply(String num1, String num2) {
        int a1[] = toIntArray(num1);
        int a2[] = toIntArray(num2);
        if(a1[0] == 0 || a2[0] == 0){
            return "0";
        }
        int [][]medianValue = getMedainValue(a1, a2);
        int []totalMedianValue = getTotalMedianValue(medianValue, a1, a2);
        
        String result = getResult(totalMedianValue);
        return result;
    }
    
     //将字符串转换为整型
     public static int[] toIntArray(String s){
        char []temp = s.toCharArray();
        int []a = new int[s.length()];
        for(int i = 0;i < s.length();i++){
			a[i] = temp[i]-'0';
		}
		return a;
    }
    
    //用二位数组存放中间乘积值
    public int[][] getMedainValue(int a1[],int a2[]){
    	 int [][]medianValuetemp = new int[a1.length][a2.length+1];
    	 
         for(int i = 0;i < a1.length;i++){
        	int esec = 0;
        	int bit = 0;
         	for(int j = a2.length -1;j >= 0;j--){
         		int temp = a1[i]*a2[j] + bit;
         		if(temp != 0){
         			bit = temp/10;
         		}else{
         			bit = 0;
         		}
         		medianValuetemp[i][esec] = temp % 10;
         		esec++;
         	}
         	if(bit > 0){
         		medianValuetemp[i][esec]=bit;
         	}
         }
		return medianValuetemp;
    }

    //对乘积中间值作求和
    public int[] getTotalMedianValue(int[][] medianValue,int a1[],int a2[] ){
    	
    	 int []total = new int[a1.length+a2.length];
         int location = 0;
         for(int i = a1.length-1; i >= 0; i--){	
         		int bit = 0;
         		int flag = location;
         		for(int j= 0;j < a2.length+1;j++){
         			int temp = medianValue[i][j]+total[flag] + bit;
         			bit = temp /10;
         			System.out.println(flag);
         			total[flag] = temp % 10; 
         			flag++;
         		}
         		location++;
         	
         }
    	
		return total;
    }
    
    //将求得的结果做适当处理转换为字符串
    public String getResult(int []medianValue){
    	String result = "";
    	if(medianValue[medianValue.length - 1] == 0){
    		for(int i = medianValue.length - 2;i >= 0;i--){
    			result = result + medianValue[i];
        	}
    	}else{
    		for(int i = medianValue.length - 1;i >= 0;i--){
    			result = result + medianValue[i];
        	}
    	}
	    return result;
    }
}

有点菜,不知道是不是跟自己封装有关系,继续加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值