一、手写算法
https://leetcode-cn.com/problems/add-to-array-form-of-integer/
思路
- 考虑到整数相加需要进位,进位处理
- 整数数组和整数长度问题
- 整数数组的最低位和k的最低位相加,再加进位,每次计算后得到下一次是否需要进位,再把k除10,保证下次取取最末位
用push和reverse搭配,时间复杂度相比unshift较低
代码
/**
* @param {number[]} num
* @param {number} k
* @return {number[]}
*/
var addToArrayForm = function(num, k) {
var len = num.length - 1,sum = 0;
var carry = 0,res = [];
while(len>=0||k>0){
// 找到最低位
var low = k%10;
// 其他剩余数值
k = Math.floor(k/10);
// 逐位相加,并加进位
sum = Math.floor((num[len] ?num[len]:0) + (low?low:0) + carry);
// 下一次是否需要进位
carry = Math.floor(sum/10);
// 当前位数字
var val = sum%10;
res.push(val)
len--;
}
if(carry>0){
res.push(carry)
}
return res.reverse();
};
复杂度分析
时间复杂度:O(max(n,k)),其中 n 为数组的长度
- 空间复杂度:O(1)
二、编程题
//1.手写函数柯里化
function curry(func) {
//此处补全
}
function sum(a, b, c) {
return a + b + c;
}
let curriedSum = curry(sum);
alert(curriedSum(1, 2, 3)); // 6, still callable normally
alert(curriedSum(1)(2, 3)); // 6, currying of 1st arg
alert(curriedSum(1)(2)(3)); // 6, full currying
//1.手写函数柯里化
function curry(func) {
//此处补全
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(null, args)
} else {
return function (...args1) {
return curried.apply(null, args.concat(args1))
}
}
}
}