有一类型的题目是模拟数学运算,完成二进制、十进制、十六进制的转换。关键算法在于取余和除两个数学操作的运用。
1. 相似题型
1.1 大数相加
image.png
1.2 整数反转
1.3 二进制求和
image.png
2. 总结
核心算法在于:
进位值=(两个字符串的最后一位相加+进位值)/对应进位;
本位值=(两个字符串的最后一位相加+进位值)%对应进位;
算法比较简单,说一下自己的bug:
1. 两个字符串长度不同
例如100 和 10相加,最终的值为110。即个位+个位,十位+十位。
反应在编程中是:字符串对应的末尾相加。
但是我开始的思路:第一个for循环处理两个字符串的公共部分,长的字符串多出来的一部分在使用一个for循环处理。
遇到的问题:循环的边界情况复杂,且这样实现代码逻辑复杂。
然后转变思路,当方法进入后,便使用一个循环进行对短字符串补0操作,直至两个字符串长度相等。然后在使用一个for循环完成除和取余的操作
不足之处:代码不够简洁,可以仅使用一个for循环完成操作;
但是两个字符串长度并不相同,如何使用一个循环来控制两个字符串中字符值的获取?
再次转变思路,使用一个for循环进行处理时,两个字符串的末尾字符的位置并不相同。for循环次数的作用便仅仅控制两个字符串相加多少次。而获取字符串对应的字符位置,需要单独处理。
循环结束后,多于的进位没有处理
比如99+10,循环计算两次,得到的值为09,进位1还没有进行拼接,所以在最终返回时,要判断进位是否为0,然后在做最终处理返回。
3. 最终代码
class Solution {
/**
* 09:00 info
* 解答成功:
* 执行耗时:15 ms,击败了5.76% 的Java用户
* 内存消耗:39.1 MB,击败了5.04% 的Java用户
*/
public String addStrings(String num1, String num2) {
char[] nc1 = num1.toCharArray();
char[] nc2 = num2.toCharArray();
//遍历-低位相加
//获取到最大遍历个数
//最大遍历的次数
int max = nc1.length > nc2.length ? nc1.length : nc2.length;
//两个集合分别遍历的开始位置
int nl1 = nc1.length - 1;
int nl2 = nc2.length - 1;
//进位
int h = 0;
String r = "";
for (int i = max - 1; i >= 0; i--) {
//分别获取两个字符数组的最后一位
int ni1 = nl1 < 0 ? 0 : Integer.valueOf(nc1[nl1] + "");
int ni2 = nl2 < 0 ? 0 : Integer.valueOf(nc2[nl2] + "");
int sum = ni1 + ni2 + h;
h = sum / 10;
r = sum % 10 + r;
nl1--;
nl2--;
}
//最后可能依旧存在进位
return h != 0 ? h + r : r;
}
}







网友评论