String——add_binary(字符串模拟加法)和multiply-strings(字符串模拟乘法)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:55   2517   0

题目一:字符串模拟二进制数加减。(十进制加法同理)

涉及字符型与整型的转换,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();
    }
}



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP