Leetcode415:Add Strings和Leetcode43: Multiply Strings

Leetcode415:Add Strings

题目描述:Add Strings

字符串相加

StringBuilder的使用

解题过程

不仅仅是简单的加法运算,题目要求中说明字符串长度<5100,比模拟人工加法多了字符串的处理,同时类似于大数运算。

 public String addStrings(String num1, String num2) {
        if (num1.length() == 0 || num1.equals("0")) return num2;
        if (num2.length() == 0 || num2.equals("0")) return num1;
        int carry = 0;
        int sum = 0;
        StringBuilder res = new StringBuilder();
        int index = 1;
        while (index <= num1.length() || index <= num2.length()) {
            int num1temp=index <= num1.length()?num1.charAt(num1.length() - index) - '0':0;
            int num2temp=index <= num2.length()?num2.charAt(num2.length() - index) - '0':0;
//            sum = carry + num1.charAt(num1.length() - index) - '0' + num2.charAt(num2.length() - index) - '0';
            sum=carry+num1temp+num2temp;
            carry = sum / 10;
            res.append(sum % 10);
            index++;
        }
//        while (index <= num1.length()) {
//            sum = carry + num1.charAt(num1.length() - index) - '0';
//            carry = sum / 10;
//            res.append(sum % 10);
//            index++;
//        }
//        while (index <= num2.length()) {
//            sum = carry + num2.charAt(num2.length() - index) - '0';
//            carry = sum / 10;
//            res.append(sum % 10);
//            index++;
//        }
        if (carry == 1) {
            res.append(carry);
        }
        return res.reverse().toString();
    }

一开始是注释的解法,也是一次性通过了。但是观摩了别人的解法后,发现自己的代码冗余很多,其实是可以在一个while中解决的问题,稍作修改,便可以使代码更加简洁美观。

Leetcode43: Multiply Strings

题目描述:Multiply Strings

字符串相乘

解题过程

算是字符串相加的进阶算法。第一想法就是类似于竖式运算的解法,而且思考很久也没有更优化的解法,就直接写了。
即,遍历num1每一位与num2相乘,然后将乘数结果再补零相加。相加就直接使用上述算法。如图:
竖式

public String multiply(String num1, String num2) {
        if (num1.length() == 0 || num2.length() == 0) return "0";
        if (num1.equals("0") || num2.equals("0")) return "0";

        String res=new String();
        for (int i=num1.length()-1;i>=0;i--){
            int carry=0;
            int mul=0;
            StringBuilder tempRes=new StringBuilder();
            for (int j=num2.length()-1;j>=0;j--){
                mul=carry+(num1.charAt(i)-'0')*(num2.charAt(j)-'0');
                carry=mul/10;
                tempRes.append(mul%10);
            }
            if (carry>0)tempRes.append(carry);
            tempRes.reverse();
            for (int i1=1;i1<num1.length()-i;i1++){
                tempRes.append(0);
            }
            res=addStrings(res,tempRes.toString());
        }
        return res;
    }

乘法的解决,也可以采用优化竖式的方法,观察出每一位相乘时会落到结尾的哪一位这个规律,然后根据规律设计算法。(不过短时间内,我观察不出来。。)这个进阶算法,在这里暂时不赘述。

完成这两道题,除了更熟练地模拟竖式运算,最大收获是对StringBuilder的使用。因为一开始解题时,直接使用String进行运算,发现用时很长,这才尝试使用StringBuilder。修改后,用时大大减少。

因此,稍微整理下StringBuilder和StringBuffer:

StringBuffer 和 StringBuilder 类

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值