解题思路:
这道题的意思就是就两个数的乘积,不过因数和积都是用字符串表示的。
基本框架是: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”;