手写算法

https://leetcode-cn.com/problems/add-to-array-form-of-integer/

  • 题目描述:
    • 整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。
    • 例如,对于 num = 1321 ,数组形式是 [1,3,2,1] 。给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。
  • 示例 ```javascript 示例1: 输入:num = [1,2,0,0], k = 34 输出:[1,2,3,4] 解释:1200 + 34 = 1234

示例2: 输入:num = [2,7,4], k = 181 输出:[4,5,5] 解释:274 + 181 = 455

示例3: 输入:num = [2,1,5], k = 806 输出:[1,0,2,1] 解释:215 + 806 = 1021

  1. - 解题:
  2. ```javascript
  3. var addToArrayForm = function(num, k) {
  4. let result = [];
  5. let len = num.length
  6. for (let i=len-1;i>=0;i--) {
  7. let sum = num[i]+k%10
  8. k = Math.floor(k/10)
  9. if (sum>=10) {
  10. k++
  11. sum = sum-10
  12. }
  13. result.push(sum)
  14. }
  15. for (;k>0;k=Math.floor(k/10)) {
  16. result.push(k%10)
  17. }
  18. result.reverse()
  19. return result
  20. };
  • 问题:少了10进1这种情况,最后参考了答案

    编程题

    1.手写函数柯里化 ```javascript function curry(func) { //此处补全 return function fn(…args) { if(args.length>=func.length) {
    1. return func.apply(this,args)
    } else {
    1. return function(...args2) {
    2. return fn.apply(this,args.concat(args2))
    3. }
    } } } 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. - 柯里化&偏函数
  2. <a name="eWev7"></a>
  3. ### 额外问题补充
  4. - 函数柯里化是否需要考虑this
  5. - 需要考虑柯里化: 函数是执行调用决定作用域链 柯里化考虑this可以保证不会修改封装的函数的作用域链不被改变
  6. - 需要考虑柯里化:如果执行柯里化的函数与作用域链上的数据无关时候(返回结果只受传入的参数影响时)可以不考虑this指向
  7. - ...如何使用es5实现
  8. ```javascript
  9. //es6
  10. function ab(...args){
  11. console.log(args)
  12. }
  13. //es5
  14. function ab() {
  15. for (
  16. var _len = arguments.length, args = new Array(_len), _key = 0;
  17. _key < _len;
  18. _key++
  19. ) {
  20. args[_key] = arguments[_key];
  21. }
  22. console.log(args);
  23. }
  • 算法题是否可以不使用额外的空间?

    1. var addToArrayForm = function (num, k) {
    2. for(let i=num.length-1;i>=0;i--) {
    3. num[i] = num[i]+(k%10)
    4. k = Math.floor(k/10)
    5. if (num[i]>=10) {
    6. num[i] =num[i] - 10
    7. k++
    8. }
    9. }
    10. for (;k>0;k=Math.floor(k/10)) {
    11. num.unshift(k%10)
    12. }
    13. return num
    14. };