Multiply Strings
Multiply Strings
问题:
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
思路:
手工模拟乘法
我的代码:
public class Solution { public String multiply(String num1, String num2) { if(num1==null || num1.length()==0 || num2==null || num2.length()==0 || num1.charAt(0)=='0' || num2.charAt(0)=='0') return "0"; if(num1.charAt(0) == '0') num1 = num1.substring(1); if(num2.charAt(0) == '0') num2 = num2.substring(1); int one = num1.length(); int two = num2.length(); String[] rst = new String[one]; for(int i=one-1; i>=0; i--) { StringBuffer sb = new StringBuffer(); for(int j=one-1; j>i; j--) sb.append('0'); int a = (int)(num1.charAt(i)-'0'); int carry = 0; for(int j=two-1; j>=0; j--) { int b = (int)(num2.charAt(j)-'0'); int c = a*b + carry; sb.append(c%10); carry = c/10; } if(carry != 0) sb.append(carry); rst[i] = sb.toString(); } int maxLength = Integer.MIN_VALUE; for(String s: rst) maxLength = Math.max(maxLength, s.length()); StringBuffer sb = new StringBuffer(); int carry = 0; for(int i=0; i<maxLength; i++) { int sum = carry; for(String s: rst) { sum += (s.length()<=i?0:(int)(s.charAt(i)-'0')); } sb.append(sum%10); carry = sum/10; } if(carry != 0) sb.append(carry); return sb.reverse().toString(); } }
他人代码:
public class Solution { public String multiply(String num1, String num2) { if (num1 == null || num2 == null) { return null; } int len1 = num1.length(), len2 = num2.length(); int len3 = len1 + len2; int i, j, product, carry; int[] num3 = new int[len3]; for (i = len1 - 1; i >= 0; i--) { carry = 0; for (j = len2 - 1; j >= 0; j--) { product = carry + num3[i + j + 1] + Character.getNumericValue(num1.charAt(i)) * Character.getNumericValue(num2.charAt(j)); num3[i + j + 1] = product % 10; carry = product / 10; } num3[i + j + 1] = carry; } StringBuilder sb = new StringBuilder(); i = 0; while (i < len3 - 1 && num3[i] == 0) { i++; } while (i < len3) { sb.append(num3[i++]); } return sb.toString(); } }
学习之处:
- 记住一个结论:两个数相乘,位数不会大于二者的位数之和,所以这样可以提前设定结果数组的大小了,不用再像我用了string的数组去存储中间结果,浪费空间,浪费时间
- 尽量少的用a,b等命名,用product多大气啊,另外能直接运算的就直接运算把,别再用变量进行记录传递了,关键是没作用,看起来代码啰嗦。
posted on 2015-05-07 16:04 zhouzhou0615 阅读(224) 评论(0) 编辑 收藏 举报