乐趣区

关于css: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], s[1][i] *= mat[m-1-r];
    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;
};

???? 后序

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

求关注求点赞 ????~~????????????

能够关注我的公众号:前端毛小悠。欢送浏览

退出移动版