题解 | #最长不含重复字符的子字符串#
大数加法
http://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475
注意:字符进行数***算的时候,每个数相差48 (字符进行算术运算时,会转换成ASCII值在进行运算) 一个减去'0'。 public static void main(String[] args) {
String solve = solve("657", "543");
System.out.println(solve);
// StringBuilder demo = new StringBuilder();
// demo.append("a");
// demo.append("f");
// demo.append("g");
// System.out.println(demo);
}
public static String solve(String str1, String str2) {
if (str1 == null || ("".equals(str1))) {
return str2;
}
if ("".equals(str2)) {
return str1; }
int maxLength = Math.max(str1.length(), str2.length());
//定义一个字符串 长度+1 用于储存可能出现的进位
StringBuilder result = new StringBuilder(maxLength + 1);//注意
//翻转两个字符串
str1 = new StringBuilder(str1).reverse().toString();
str2 = new StringBuilder(str2).reverse().toString();
int minLength = Math.min(str2.length(), str1.length());
//位进
int carry = 0;
//当前位上的数值
int currentNum = 0;
int i = 0;
for (; i < minLength; i++) { //先从最小的那个数进行,之后有个全局的变量i记录到已经相加的元素,再往后进行相加
currentNum = str2.charAt(i) + str1.charAt(i) - 2 * '0' + carry;
//获取进位
carry = currentNum / 10;
//处理当前位置的最终值
currentNum %= 10;
//保存当前位的值到最终的字符缓冲区中
result.append(String.valueOf(currentNum));
}
if (str1.length() < str2.length()) {
//选择
str1 = str2;
}
for (; i < str1.length(); i++) { //往后进行相加
currentNum = str1.charAt(i) - '0' + carry;
//获取进位
carry = currentNum / 10;
currentNum %= 10;
result.append(String.valueOf(currentNum));
}
//处理最后一个进位( 当循环结束后,是不是还可能又一个进位)
if (carry>0){
result.append(String.valueOf(carry));
}
return result.reverse().toString();
}
传统的解法,超过一定的容量会报错。
采用字符串翻转的方法进行