JS | 教练,我想做习题16

🚀 前言

大家好呀,我是毛小悠,可以叫我二毛,在家中排行老二,是一名前端开发工程师。

本系列文章旨在通过练习来提高JavaScript的能力,一起愉快的做题吧。😀😀😀

以下每道题,二毛我都有尝试做一遍。建议限时训练,比如限定为半小时,如果半小时内想不出来,可以结合文章末尾的参考答案来思考。

可以在下方评论区留言或者加我的微信:code_maomao。期待你的到来。

求关注求点赞👍~~~😘😘😘

📖 题目1:#9矩阵:添加对角乘积

我们有一个维数为n x n的方阵M,该方阵M的正负数在[-9,-1]和[0,9]范围内(不包括值0)。

我们要把对角线元素的所有乘积从上到下到下,即sum1的值;以及对角线元素UP-RIGHT到LEFT-DOWN,即sum2。然后,作为最终结果,sum1-sum2的值。

例如

M = [[ 1,  4, 7,  6,  5],
     [-3,  2, 8,  1,  3],
     [ 6,  2, 9,  7, -4],
     [ 1, -2, 4, -2,  6],
     [ 3,  2, 2, -4,  7]]

让我们在下图中查看如何获得此结果:
在这里插入图片描述

因此sum1-sum2的值等于:

1164 - 66 = 1098

创建代码以执行此计算。

随机测试的特点:

Numbers of tests = 150
10 < dimension < 25 (python and ruby)
10 < dimension < 20 (javascript)
-10 < M[i,j] < 0 and 0 < M[i,j] < 10

习题代码:

function sumProdDiags(matrix) {
    var m
    //your code here
    return m  // m an integer
}

📖 题目2:指数增加的最大差异

编写一个函数,该函数接受数字数组数据并返回索引j-i中的最大差,使得data [i] <= data [j]


详细说明:

最大差异采用数字数组。该数组未排序。请勿对其进行排序或以任何方式更改元素的顺序或其值。

考虑数组中的所有数字对,其中第一个小于或等于第二个。

从这些中找到一对,它们在阵列中的位置相距最远。

返回此对中两个数组元素的索引之间的差。


范例:

largestDifference([1,2,3]) ; // returns 2, because here j = 2 and i = 0 and 2 - 0 = 2

习题代码:

var largestDifference = function(data) {
  // TODO: Program solution
};

答案

🍗 题目1的答案

参考答案1:

function sumProdDiags(matrix) {
    var sum1={},sum2={}
    for(var i in matrix) for (var j in matrix[i]) {
      sum2[+i+ +j]=(sum2[+i+ +j]||1)*matrix[i][j]
      sum1[i-j]=(sum1[i-j]||1)*matrix[i][j]
    }
    return Object.keys(sum1).reduce((a,b)=>a+sum1[b],0) - Object.keys(sum2).reduce((a,b)=>a+sum2[b],0)
}

参考答案2:

function sumProdDiags(mat) {
    var i, c, r, m = mat.length, n = 2*m, s = [Array(n).fill(1),Array(n).fill(1)];
    for (r=i=0; i<n; r=++i) for (c=0; c<m; --r, ++c)
        if (r<0) break; else if (r<m) s[0][i] *= mat[r][c], s[1][i] *= mat[m-1-r][c];
    return (s = s.map(a => a.reduce((a,b) => a+b,0)))[1]-s[0];
}

参考答案3:

function sumProdDiags(matrix) {
    var sum=0;
    for (var i=0; i<matrix.length; ++i)
    {
      var s1=1, s2=1, s3=1, s4=1;
      for (var j=i; j<matrix.length; ++j)
      {
        s1*=matrix[j-i][j];
        s2*=matrix[j][j-i];
        s3*=matrix[matrix.length-j-1][j-i];
        s4*=matrix[matrix.length-1-j+i][j];
      }  
      if (i==0)
        sum+=s1-s3;
      else
        sum+=s1+s2-s3-s4;
    }
    return sum;
}

参考答案4:

function sumProdDiags(matrix) {
  let size = matrix.length;
  let sum = 0;
  
  for (let i = 0; i < size; i++) {
    let a = 1, b = 1, c = 1, d = 1;
    for (let j = 0; j < size-i; j++) {
      a *= matrix[j][j+i];
      b *= matrix[j+i][j];
      c *= matrix[j][size-i-j-1];
      d *= matrix[j+i][size-j-1];
    }
    if (i === 0) {
      sum += a - c;
    } else {
      sum += a + b - c - d;
    }
  }

  return sum;
}

参考答案5:

function sumProdDiags(matrix) {
  const range = (lower, upper) => Array.from({length: upper - lower}, (value, key) => lower + key);
  const len = matrix.length;
  const v = range(-len, len+1);
  const M = matrix;
  const sums = (a, s) => v.map(b => M.map((x, i) => x[a+s*(i+b)]).filter(x => x !== undefined).reduce((x,y) => x*y, 1)).reduce((x,y) => x+y, 0);
  return sums(0, 1) - sums(len, -1);
}

🍗 题目2的答案

参考答案1:

var largestDifference = function(data) {
  var result = 0;
  for(var i = 0; i < data.length; ++i) {
    for(var j = 1; j < data.length; ++j) {
      if (data[i] <= data[j]) {
        if(j-i > result)
          result = j-i;
      }
    }
  }
  return result;
};

参考答案2:

/*
* This algorithm solves the kata in O(n*log(n)) using binary search
* The comb function returns a boolean for a difference
* For different differences, the return values for comb must be like this
* [true,true,true,....,true,false,false,....,false]
*
* The answer to this kata is the last true value, and this can be found
* by narrowing the bounds by half every time.
*/

var comb=function(data,diff){
  for(var i=0;i<data.length-diff;i++){
    if(data[i]<=data[i+diff]){return true;}
  }
  return false;
};

var largestDifference = function(data) {
  
  var upperBound=data.length-1, lowerBound=0;
  if(comb(data,upperBound)){
    return upperBound;
  }else if(!comb(data,lowerBound)){
    return lowerBound;
  }
  
  var checkUpper=true; //Start binary search from upper bound
  while(upperBound-lowerBound!=1){
    var middle=checkUpper ? Math.ceil((lowerBound+upperBound-1)/2) :Math.floor((lowerBound+upperBound+1)/2)
    var checked=comb(data,middle);
    if(checked){
      // Move lowerBound up
      lowerBound=middle;
      checkUpper=true;
    }else{
      // Move lowerBound down
      upperBound=middle;
      checkUpper=false;
    }
  }
  return lowerBound;
};

参考答案3:

var largestDifference = function(data) {
  for (var i = 0, diff = 0; i < data.length; i++)
    for (var j = 0; j < data.length; j++)
      if ( data[i] <= data[j] && (j-i) > diff) diff = j - i; 
  return diff;
};

参考答案4:

var largestDifference = function(data) {
  var i = 0, len = data.length, diff = len - 1;
  while(diff > 0) {
    if(data[i] <= data[i + diff]) return diff;
    if(i + diff + 1 >= len) {i = 0; diff--;}
    else i++;
  }
  return 0;
};

参考答案5:

var largestDifference = function(a) {
  let m=0;
  for(let i=0;i<a.length;i++)
    for(let j=i;j<a.length;j++)
      if (a[i]<=a[j]) m=Math.max(m,j-i);
  return m;
};

🍁后序

本系列会定期更新的,题目会由浅到深的逐步提高。

求关注求点赞 👍~~🍭🍭🍭

可以关注我的公众号:前端毛小悠。欢迎阅读

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值