这是遇到的一道快手数仓岗位的面试题目,题目大意如下:
题目详情
现在有两个用字符串表示的数字,例如num1=“9999933332232”,num2=“999999425262”,问题是请你对两个数字求和,即求num1+num2
Java实现
分析
这里给出我的一种思路,如果有不一样的方法,请指教一下,不胜感激。
1、新建一个StringBuilder,存储计算后返回的数字结果
2、从尾到头遍历两个字符串的数字,相加计算进位和当前位置的值
3、上面计算完之后,判断进位是否为1,是则将给StringBuilder对象再append1,否则不做操作
Java 怎么获取到字符串中的对应位置的数字值
本题涉及的一个转换字符值到对应数字值,可能是一个难点。
在java中我们通过num1.charAt(length1)可以获得对应位置字符的ascII码值,但是我们需要的是数字值,才能用于计算,其实也很简单,但是不知道的时候就有点麻烦。
使用字符ascII码值的运算:num1.charAt(length1) - ‘0’ 返回对应位置的数字值,解决问题了。
Java完整代码
代码中有详细的注释,实现过程主要是入上述分析。
public static String BigDataAdd(String num1, String num2) {
int length1 = num1.length() - 1; // 方便下面索引取值,因此减1
int length2 = num2.length() - 1;
int carry = 0;
StringBuilder sb = new StringBuilder();
while (length1 >= 0 || length2 >= 0) {
int a = (length1 >= 0)? num1.charAt(length1) - '0' : 0; // 将asc码值计算转成数字值
int b = (length2 >= 0)? num2.charAt(length2) - '0' : 0;
int sum = a + b + carry;
carry = sum / 10; // 进位
sb.append(sum % 10);
length1--;
length2--;
}
if (carry == 1) { // 有进位
sb.append(1);
}
sb.reverse();
return sb.toString();
}
测试验证
public static void main(String[] args) {
System.out.println(BigDataAdd("9999933332232", "999999425262"));
}
public static void main(String[] args) {
System.out.println(BigDataAdd("9999933332232", "425262"));
}
python实现
python 怎么获取到字符串中的对应位置的数字值
在python中获取对应位置的值更加容易。python中的字符串可以看做一个字符数组,直接能取值,然后再强转成int类型就可以嘞
int(num1[l1]) 即可获取到指定位置的数字值,是不是更加简单,python的完整实现,见下面代码
python完整代码
def bigDataAdd(num1, num2):
l1 = len(num1) - 1
l2 = len(num2) - 1
carry = 0
sb = []
while l1 >= 0 or l2 >= 0:
a = int(num1[l1])
b = int(num2[l2])
sum = a + b + carry
carry = sum // 10
sb.append(sum % 10)
l1 -= 1
l2 -= 1
if carry == 1:
sb.append(1)
sb.reverse()
result = ""
for i in sb:
result += str(i)
return result
总结
这应该也是一道比较简单的面试题,我当时没有处理好的就是怎么获取到字符串中的数字值,就放在这里记录一下吧。顺便如果有不一样的方法,也希望能交流一下,不胜感激。
ps:计划每日更新一篇博客,今日2023-05-18,日更第三十二天。
昨日更新:
leetcode 不同路径详解