文章目录
前言
复盘一下最近面试遇到简单关于算法的面试题,本篇介绍的是大数相加的算法实现。
题目
面试官: 请你说一下如何实现2个大数相加的业务?
面试者:这个简单,用long接收数字,再计算不就好了。
面试官:那如果是这个大数连long都无法装下呢,如100位的大数。
面试者:会不会是题目出错了?
面试官:题目没有错,今天就先面试到这里回去等通知吧。
面试者:###xxxx。。。
解题思路
- 通过比较2个大数的字符长度来确认数组的长度 :maxLength+1;
- 将2个大数字符串通过字符串截取倒序的分表放到2个数组中,如 3248 放到数组中就是 {8,4,2,3} ;
- 创建一个结果数组,然后遍历数组,用2个数组相加,当前位数大于等于10则减10下一位进1 ;
- 倒序遍历结果数组,将结果拼接到stringbuilder中(要注意找到数组中真正的首位数字)。
代码实现
代码如下(示例):
/**
* 大数相加实现 用2个数组来相加
* @param bigNumberA 大数a
* @param bigNumberB 大数b
* @return
*/
public static String add(String bigNumberA,String bigNumberB) {
//确认出最大的数组长度
int maxLength = bigNumberA.length() > bigNumberB.length() ? bigNumberA.length() : bigNumberB.length();
//将大数A拆成数字放到数组中 倒序插入数组中 个位数在数组的第一位
int[] arrayA = new int[maxLength + 1];
for (int i=0;i<bigNumberA.length();i++) {
arrayA[i] = Integer.parseInt(bigNumberA.substring(bigNumberA.length()-1-i,bigNumberA.length()-i));
}
//将大数B拆成数字放到数组中 倒序插入数组中 个位数在数组的第一位
int[] arrayB = new int[maxLength + 1];
for (int i = 0; i < bigNumberB.length(); i++) {
arrayB[i] = Integer.parseInt(bigNumberB.substring(bigNumberB.length()-1-i,bigNumberB.length()-i));
}
//创建一个计算结果的数组
int[] result = new int[maxLength + 1];
for(int i=0;i<result.length;i++){
int temp = result[i];
//同位数相加
temp+=arrayA[i];
temp+=arrayB[i];
//如果大于等于10则下一位数进1
if(temp>=10){
temp =temp-10;
result[i+1] =1;
}
result[i] =temp;
}
//定义一个是否找到首位的数字
boolean findFirst = false;
//将result数组转换为数字
StringBuilder builder =new StringBuilder();
for(int i=result.length-1;i>=0;i--){
if(!findFirst){
if(result[i]==0){
//首位数字为0都直接结束本次的循环
continue;
}
//找到首位数字直接赋值为true
findFirst = true ;
}
builder.append(result[i]);
}
return builder.toString();
}
测试
public static void main(String[] args) {
String str = BigDataAddition.add("2339831","8323623");
System.out.println(str);
}
测试结果:
总结
算法题难得是解题的思路,如果思路有了,代码的实现并不难,大家在刷leetcode时,不要为了刷题而刷题,尽量去理解解题的思路。