【leetcode】43. (Medium)Multiply Strings

题目链接


解题思路:
这道题的意思就是就两个数的乘积,不过因数和积都是用字符串表示的。
基本框架是:http://www.cnblogs.com/TenosDoIt/p/3735309.html
在这里插入图片描述

我的思路是:
首先计算一个二维数组pros(products),分别计算出上图中黑色算式的数值;
这个二维数组中的每一排数字前面和后面都会有空缺,需要额外填补上,
比如说第一排数组其实是[0,0,16,64,72],第二排的数组其实[0,10,40,45,0]…
依次类推;
然后最初的结果是矩阵每一列的相加,加在res上,比如res的第一个元素值就是0+0+14=14,第二元素值是0+10+56=66…依次类推;
最后从res数组的最后一个一个一个向前加,加成每一位都是个位数的情况,
比如res最后一位是72,将70传给上一位,本位只剩2;res的倒数第二位109加上后一位传过来的7之后变成116,将110传给前一位,本位只剩6…依次类推;
然后再将数组结果转化为字符串。

提交代码:

class Solution {
    public String multiply(String num1, String num2) {
    	 if(num1.equals("0")||num2.equals("0"))    return "0";
         if(num1=="1")   return num2;
         if(num2=="1")   return num1;
    	
    	
        List<List<Integer>> pros=new ArrayList<List<Integer>>(); //products
        List<Integer> res=new ArrayList<Integer>();
        int zerocnt=Math.min(num1.length()-1, num2.length()-1);
        int cnt=0,sum=0;
        
        //长的因数在上面,短的因数在下面
        if(num1.length()<num2.length()) {
        	String tmp=num1;
        	num1=num2;
        	num2=tmp;
        }
        
        
        for(int i=num2.length()-1;i>=0;i--) {  //dimension1
        	List<Integer>	row=new ArrayList<Integer>();
			//添加每一排前面的空缺
        	for(int k=0;k<zerocnt-cnt;k++)
        		row.add(0);
        	
        	for(int j=0;j<num1.length();j++)   //d2
        		row.add(Num(num1.charAt(j))*Num(num2.charAt(i)));
        	//添加每一排后面的空缺
        	for(int k=0;k<cnt;k++)
        		row.add(0);
        	
        	
        	//System.out.println(row);
        	pros.add(row);
        	cnt++;
        }
        //System.out.println(pros);
        
        
        //calculate the pros
        for(int i=0;i<pros.get(0).size();i++) {	 //column
        		for(int j=0;j<pros.size();j++)
        			sum+=pros.get(j).get(i);
        		res.add(sum);
        		sum=0;
        	}
       // System.out.println(res);
        
        for(int i=res.size()-1;i>0;i--) {
        	if(res.get(i)>=10) {
        		res.set(i-1, res.get(i-1)+res.get(i)/10);
        		res.set(i,res.get(i)%10);
        	}
        	System.out.println(res);
        }
        if(res.get(0)>=10) {
        	int tmp=res.get(0);
        	res.add(0, tmp/10);
        	res.set(1, tmp%10);
        }
        System.out.println(res);
        
        String s=new String();
        for(int i=0;i<res.size();i++)
        s+=Integer.toString(res.get(i));
        
        System.out.println(s);
        
        return s;
    }
    
    public int Num(char c) {
    	return c-'0';
    	}
}

运行结果:
在这里插入图片描述

其他:
1.怎么向二维List中添加List:
List<List> d2=new ArrayList<List>(); //这是一位二维数组

for(int i=0;i<m;i++)
List d1=new List(); //这是一个新添加的一维数组
d2.add(d1);

1>就是每次添加的总是new的List();
2>一个一维数组被添加之后不能被删掉,就是不能:
for(int i=0;i<m;i++)
List d1=new List();
d2.add(d1);
d1.clear();

不然之前添加在d2中的那个d1也会被clear掉


2.重置ArrayList中某一个元素的值:
List list=new ArrayList();
list.set(0,3); //将list中的第0位置为3


3.将一个int型转为string:
String s= Integer.toString(7);


4.如果下面这段代码写成if(num1==“0”||num2==“0”) return “0”; OJ识别不出来,会判错

if(num1.equals(“0”)||num2.equals(“0”)) return “0”;

猜你喜欢

转载自blog.csdn.net/AXIMI/article/details/83654175