字符串相加和相乘-手撕

看到牛油分享的面经。

实现两个大数的相加,输入的都是字符串,从两个字符串的末尾开始进行遍历模拟,时间复杂度是 O(N)级别的.一个长度比较长,一个长度比较小,通过三元运算符,长度小于 0 的时候,对应的位数直接赋值为 0。利用双指针的思想来解决这个问题。

   public String addStrings(String num1, String num2) {
        int len1 = num1.length() - 1;
        int len2 = num2.length() - 1;
        int carry = 0;
        StringBuffer sb = new StringBuffer();
        while (len1 >= 0 || len2 >= 0) {
            int x = len1 >= 0 ? num1.charAt(len1) - '0' : 0;
            int y = len2 >= 0 ? num2.charAt(len2) - '0' : 0;
            int cur = x + y + carry; //当前的
            carry = cur / 10;
            len1--;
            len2--;
            sb.append(cur % 10);
        }
        if (carry != 0) {
            sb.append(carry);
        }
        return sb.reverse().toString();
   }

大数向乘 模拟两个字符串相乘,用一个数组来保存临时的数据,最后再从末尾开始处理数组,数组长度等于两个字符串长度之和。

//大数相乘
    public String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        int  len1=num1.length();
        int  len2=num2.length();
        int  m=len2+len1;
        int[] arr =new int[len1+len2];
        for (int i = num1.length()-1; i >=0 ; i--) {
            int x=num1.charAt(i) - '0';
            for (int j = num2.length()-1; j >=0 ; j--) {
                int y=num2.charAt(j) - '0';
              arr[i+j+1]=arr[i+j+1]+x*y;
            }
        }
        for (int i = m-1; i>0; i--) {
            arr[i-1]+=arr[i]/10;
            arr[i]=arr[i]%10;  //刚开始这个漏掉了  a[i]需要和10进行取模
        }
        StringBuffer sb = new StringBuffer();
        int index=arr[0]==0?1:0;
        for (int i=index; i<arr.length; i++) {
            sb.append(arr[i]);
        }
        return sb.toString();
    }
#字符串相加和相乘-手撕##面试手撕#
牛牛的算法专栏 文章被收录于专栏

牛牛的算法专栏,记录一些算法题

全部评论

相关推荐

评论
2
3
分享

创作者周榜

更多
牛客网
牛客企业服务