题目一:字符串模拟二进制数加减。(十进制加法同理)
涉及字符型与整型的转换,String与字符数组的转换。
import java.util.*;
public class Solution {
public String addBinary(String a, String b) {
if(a == null||a.length() == 0)
return b;
if(b == null||b.length() == 0)
return a;
char[]first=a.toCharArray();
char[]second=b.toCharArray();
int index_a=first.length-1;
int index_b=second.length-1;
int index=0;
char[] result=new char[Math.max(index_a,index_b)+2];
int carry=0;
while(index_a>=0||index_b>=0||carry!=0)
{
int sum=carry;
if(index_a>=0)
sum+=first[index_a--]-'0';
if(index_b>=0)
sum+=second[index_b--]-'0';
if(sum>=2)//若改为10进制数加法,只需将这里面的进制改为10;
{
carry=sum/2;
sum=sum%2;
}else
{
carry=0;
}
result[index++]=(char)(sum+'0');//int型和char型运算,向高出转。
}
reverse(result,0,index-1);
return String.valueOf(result,0,index);
}
public void reverse(char[] ch,int begin,int end)
{
while(begin<end)
{
char temp=ch[begin];
ch[begin]=ch[end];
ch[end]=temp;
begin++;
end--;
}
}
}
题目二:字符串模拟十进制(非负整数)乘法
感谢 爱做饭的小莹子 http://www.cnblogs.com/springfor/p/3889706.html
- 直接乘会溢出,所以每次都要两个single digit相乘,最大81,不会溢出。
- 比如385 * 97, 就是个位=5 * 7,十位=8 * 7 + 5 * 9 ,百位=3 * 7 + 8 * 9 …
可以每一位用一个Int表示,存在一个int[]里面。(num[i]存放10的i次方数量级的数) - 这个数组最大长度是num1.len + num2.len,比如99 * 99,最大不会超过10000,所以4位就够了。
- 这种个位在后面的,不好做(10的0次方,可惜对应位的数组index不是0而是n-1),
所以干脆先把string reverse了代码就清晰好多。 - 最后结果前面的0要清掉。
public class Solution {
public String multiply(String num1, String num2) {
int[] num=new int[num1.length()+num2.length()];
String s1=new StringBuilder(num1).reverse().toString();//将数字字符串先反转,方便后面求乘积存放在num数组中
String s2=new StringBuilder(num2).reverse().toString();
for(int i=0;i<s1.length();i++)
{
int a=s1.charAt(i)-'0';//可以看出a为10的i次方数量级
for(int j=0;j<s2.length();j++)
{
int b=s2.charAt(j)-'0';//b为10的j次方数量级的数
num[i+j]+=a*b;//num[i+j]10的(i+j)次方数量级
}
}
StringBuilder sb=new StringBuilder();
for(int i=0;i<num.length;i++)
{
int digit=num[i]%10;
int carry=num[i]/10;
sb.insert(0,digit);//最后sb前面可能会有很多的0
if(i+1<num.length)//这里不加这个if的话就算carry为0, 当i == num.length()-1时仍然数组越界.
num[i+1]+=carry;
}
while(sb.length()!=0&&sb.charAt(0) == '0')//使用下标时,一定要先考虑到越界判断
sb.deleteCharAt(0);
return sb.length() == 0?"0":sb.toString();
}
}
|