989.数组形式的整数加法

 

 解法一、按位相加

自己的第一个想法,类似计算机组织与结构中实现的加法器。当然事实上第一个想法是转化num为数直接加再转回去hhh发现会溢出,果然没那么简单。改换成long做也失败了,老老实实强解吧

类似加法器,评论区也指出,原理就是每位=(加数1当前位+加数2当前位+进位)%10。进而想起来乘法器当时学得草草的,惭愧。

看了一下时间上的最优解,应该大概就是把while换成for,循环num。在数组遍历结束后,再单独对每位加k。确实少算了很大一部分

class Solution {
    public List<Integer> addToArrayForm(int[] num, int k) {
        int len = num.length - 1;
        List<Integer> res = new LinkedList<>();
        int carry = 0;

        while(len >= 0 || k != 0){
            //准备
            int a = len >= 0 ? num[len] : 0;
            int b = k % 10;//省去判断

            int c = (a + b + carry) % 10;//计算
            res.add(0,c);

            carry = (a + b + carry) / 10;//下一轮
            if(len >= 0){
            len--;}
            k /= 10;
        }
        if(carry != 0){//如果此时还有carry,必然在1-9之间,加法的特性所在即位加后视一位
            res.add(0,carry);
        }
        return res;
    }
}

解法二、整个k与某位相加,记录最后一位,再除去最后一位。逐位往上

如,[1,2,3,4] 加 123。

第四位4+123=127,留7,除去7,变成12。再运算第三位,3+12,留5,除去5,变成1。运算第二位,2+1=3。这里k自带进位,省去了进位的麻烦。

class Solution {
    public static List<Integer> addToArrayForm(int[] num, int k) {
        LinkedList<Integer> res = new LinkedList();
        int len = num.length;
        for(int i = len-1 ;i>=0 || k > 0;i--,k/=10){//k在循环条件中除10
            if(i>=0)k+= num[i];//k和当前位相加,此处i为0也没关系
            res.add(k%10);//k最后一位留在当前位。
        }
        Collections.reverse(res);
        return res;
    }

}

 


从评论区 处看到了并查集的概念,由此搜了搜了解一下。试着问了问chatgpt能不能用并查集做,失败。请看这位的总结↓

并查集(算法)-CSDN博客


今日碎碎念
  • 学会了LinkedList和ArrayList的差别。前者是基于链表,便于查找。后者基于数组,便于增删。
  • 学会了Collections类。ArrayList是从前往后加数,所以最后需要reverse一下

Collections是Java中用于操作集合的工具类,它提供了一系列静态方法来对集合进行排序、查找、遍历等操作。 

  • 学会了判断时,若是||,左面成功就直接执行下一步。(这个是昨天题中官方题解里是xxx||++diff=3,原来等效于diff++;if(diff == 3)。后来又想起来大一是听过的,还是基础不够足) 
  • 其实还学会了LinkedList<>中后面指定类型的用法,经常见到,但是自己写了才增进了解。这个实在太基础了,有点不好意思说(

今天依旧是简单题。时间确实缩短了很多,也可能是因为加法器正好会。初步上手依旧进展非常慢,大多题解可以看懂、但自己上手还是疏漏百出,和厉害的人差得很远。但也希望能保持每日一题的节奏。共勉!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值