Cool说丨力扣989

简介: 989. 数组形式的整数加法

989. 数组形式的整数加法  经典,很经典的题目,一步步渐进,直到最优解法

对于非负整数 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

第一版,自己写的,时间和空间都一般

执行用时 :180 ms, 在所有 cpp 提交中击败了54.11%的用户

内存消耗 :13.7 MB, 在所有 cpp 提交中击败了39.51%的用户

vector<int>addToArrayForm(vector<int>&A, intK) { //52134

   

   vector<int>temp,res;

   

   while (K!=0) {

       temp.push_back(K%10);

       K=K/10;

   }

   inti=A.size() -1,j=0;

   for (; i>=0&&j<temp.size(); --i,++j) {

       res.push_back(temp[j] +A[i]);  

   }

   if (j==temp.size() &&i>=0) {

       for (   ; i>=0;--i) {      

           res.push_back(A[i]);

       }

   }

   elseif (i==-1&&j<temp.size())

   {

       for ( ; j<temp.size(); ++j) {

           res.push_back(temp[j]);

       }

   }

   for (i=0; i<res.size(); ++i) {

       if (res[i] >9) {

           res[i] =res[i] -10;

           if (i!=res.size() -1) res[i+1] =res[i+1] +1;

           else

               res.push_back(1);

       }

   }

   reverse(res.begin(), res.end());

   returnres;

}

第二版,反而越改越差

执行用时 :204 ms, 在所有 cpp 提交中击败了47.70%的用户

内存消耗 :13.8 MB, 在所有 cpp 提交中击败了39.51%的用户

 vector<int>addToArrayForm(vector<int>&A, intK) {

  vector<int>temp;    

   while (K!=0) {

       temp.push_back(K%10);

       K=K/10;

   }

   inti=A.size() -1,j=0;

   for (; i>=0&&j<temp.size(); --i,++j) {

       temp[j]=temp[j] +A[i];

   }

   if (j==temp.size() &&i>=0) {

       for (   ; i>=0;--i) {      

           temp.push_back(A[i]);

       }

   }

   for (i=0; i<temp.size(); ++i) {

       if (temp[i] >9) {

           temp[i] =temp[i] -10;

           if (i!=temp.size() -1) temp[i+1] =temp[i+1] +1;

           else

               temp.push_back(1);

       }

   }

   reverse(temp.begin(), temp.end());

   returntemp;

   }

第三版,又改进了一下,快多了

执行用时 :136 ms, 在所有 cpp 提交中击败了95.79%的用户

内存消耗 :12.3 MB, 在所有 cpp 提交中击败了92.20%的用户

   vector<int>addToArrayForm(vector<int>&A, intK) {

   vector<int>temp;  

   while (K!=0) {

       temp.push_back(K%10);

       K=K/10;

   }

   reverse(A.begin(), A.end());

   size_ti=0;

   for ( ; i<A.size() &&i<temp.size();++i) {

       A[i]=temp[i] +A[i];

       if (A[i] >9&&i!=A.size() -1) {

           A[i] =A[i] -10;

           A[i+1] =A[i+1] +1;

       }

       elseif (A[i] >9&&i==A.size() -1) {

           A[i] =A[i] -10;

           A.push_back(1);

       }

   }

   if (i==temp.size()) {

   for (   ; i<A.size();++i) {        

       if (A[i] >9&&i!=A.size() -1) {

           A[i] =A[i] -10;

           A[i+1] =A[i+1] +1;

       }

       if ( A[i] >9&&i==A.size() -1) {

           A[i] =A[i] -10;

           A.push_back(1);

       }

       }

   }

   elseif (i==A.size())

   {

       for (; i<temp.size(); ++i) {

           A.push_back(temp[i]);

       }

   }

   reverse(A.begin(), A.end());

   returnA;

   }


目录
相关文章
|
人工智能 C# C++
Cool说丨力扣153、454
153. 寻找旋转排序数组中的最小值 454. 四数相加 II
132 1
|
C# C++
Cool说丨力扣287/792/378
关注博主,获取更多知识
106 0
|
C# C++ 索引
Cool说丨力扣162
162. 寻找峰值
98 0
|
存储 C# C++
Cool说丨力扣29/34
关注博主。获取更多知识
105 0
|
存储 C# C++
Cool说丨力扣392
392. 判断子序列
75 0
|
C# C++
Cool说丨力扣744、704
744. 寻找比目标字母大的最小字母 704. 二分查找
107 0
|
C#
Cool说丨力扣475
475. 供暖器
115 0
|
机器学习/深度学习 算法 C#
Cool说丨力扣202
202. 快乐数
101 0
|
C#
Cool说丨力扣167
167. 两数之和 II - 输入有序数组
71 0
|
C# C++
Cool说丨力扣374、441
441. 排列硬币 374. 猜数字大小
95 0