高频算法题之两数之和


前言

复盘一下最近面试遇到简单关于算法的面试题,本篇介绍的是大数相加的算法实现。

题目

面试官: 请你说一下如何实现2个大数相加的业务?
面试者:这个简单,用long接收数字,再计算不就好了。
面试官:那如果是这个大数连long都无法装下呢,如100位的大数。
面试者:会不会是题目出错了?
面试官:题目没有错,今天就先面试到这里回去等通知吧。
面试者:###xxxx。。。

解题思路

  1. 通过比较2个大数的字符长度来确认数组的长度 :maxLength+1;
  2. 将2个大数字符串通过字符串截取倒序的分表放到2个数组中,如 3248 放到数组中就是 {8,4,2,3} ;
  3. 创建一个结果数组,然后遍历数组,用2个数组相加,当前位数大于等于10则减10下一位进1 ;
  4. 倒序遍历结果数组,将结果拼接到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时,不要为了刷题而刷题,尽量去理解解题的思路。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值