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 类。