加载中...
989-数组形式的整数加法(Add to Array-Form of Integer)
发表于:2021-12-03 | 分类: 简单
字数统计: 988 | 阅读时长: 4分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/add-to-array-form-of-integer

英文原文

The array-form of an integer num is an array representing its digits in left to right order.

  • For example, for num = 1321, the array form is [1,3,2,1].

Given num, the array-form of an integer, and an integer k, return the array-form of the integer num + k.

 

Example 1:

Input: num = [1,2,0,0], k = 34
Output: [1,2,3,4]
Explanation: 1200 + 34 = 1234

Example 2:

Input: num = [2,7,4], k = 181
Output: [4,5,5]
Explanation: 274 + 181 = 455

Example 3:

Input: num = [2,1,5], k = 806
Output: [1,0,2,1]
Explanation: 215 + 806 = 1021

Example 4:

Input: num = [9,9,9,9,9,9,9,9,9,9], k = 1
Output: [1,0,0,0,0,0,0,0,0,0,0]
Explanation: 9999999999 + 1 = 10000000000

 

Constraints:

  • 1 <= num.length <= 104
  • 0 <= num[i] <= 9
  • num does not contain any leading zeros except for the zero itself.
  • 1 <= k <= 104

中文题目

对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]

给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。

 

示例 1:

输入:A = [1,2,0,0], K = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234

示例 2:

输入:A = [2,7,4], K = 181
输出:[4,5,5]
解释:274 + 181 = 455

示例 3:

输入:A = [2,1,5], K = 806
输出:[1,0,2,1]
解释:215 + 806 = 1021

示例 4:

输入:A = [9,9,9,9,9,9,9,9,9,9], K = 1
输出:[1,0,0,0,0,0,0,0,0,0,0]
解释:9999999999 + 1 = 10000000000

 

提示:

  1. 1 <= A.length <= 10000
  2. 0 <= A[i] <= 9
  3. 0 <= K <= 10000
  4. 如果 A.length > 1,那么 A[0] != 0

通过代码

高赞题解

这道题和2. 两数相加一样,换汤不换药。

只要记住这个公式,不管两个数是列表形式,还是数组形式,都不会写错!

<**公式**>

当前位 = (A 的当前位 + B 的当前位 + 进位carry) % 10

注意,AB两数都加完后,最后判断一下进位 carry, 进位不为 0 的话加在前面。

<**加法模板**>

while ( A 没完 || B 没完)

    A 的当前位

    B 的当前位



    和 = A 的当前位 + B 的当前位 + 进位carry



    当前位 = 和 % 10;

    进位 = 和 / 10;



判断还有进位吗

class Solution {

    public List<Integer> addToArrayForm(int[] A, int K) {

        int n = A.length;

        List<Integer> res = new ArrayList<>();  // 可以用 LinkeList,或者 ArrayList 往后加,最后反转

        int i = n - 1, sum = 0, carry = 0;

        while (i >= 0 || K != 0) {  // 循环条件:两个数有一个没完

            int x = i >= 0 ? A[i]: 0;

            int y = K != 0 ? K % 10 : 0;

                        

            sum = x + y + carry;

            carry = sum / 10;

            K = K / 10;



            i--;

            res.add(0, sum % 10);

        }

        if (carry != 0) res.add(0, carry);

        return res;

    }

}

这个模板真的可以解很多题。比如 165. 比较版本号


// 细节: split的时候,【.】在JAVA正则表达式里有特殊含义,表示"任意字符",需要进行转义

class Solution {

    public int compareVersion(String version1, String version2) {

        String[] v1 = version1.split("\\."); 

        String[] v2 = version2.split("\\.");



        int m = v1.length, n = v2.length;

        int i = 0;

        while (i < m || i < n) {

            int a = i < m ? Integer.valueOf(v1[i]) : 0;

            int b = i < n ? Integer.valueOf(v2[i]) : 0;

            if (a == b) {

                i++;

                continue;

            }

            return Integer.compare(a, b);

        }

        return 0;

    }

}

还可以推广到字符串比较。比如这道谷歌高频题:809. 情感丰富的文字

<**比较模板**>

while( A 没完 && B 没完)

    A 的当前字符

    B 的当前字符



    A 的当前字符长度

    B 的当前字符长度



    判读符合比较条件吗

判断 A B 都走完了吗

统计信息

通过次数 提交次数 AC比率
54187 115240 47.0%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言

相似题目

题目 难度
两数相加 中等
加一 简单
二进制求和 简单
字符串相加 简单
上一篇:
990-等式方程的可满足性(Satisfiability of Equality Equations)
下一篇:
991-坏了的计算器(Broken Calculator)
本文目录
本文目录