???? 前言
大家好呀,我是毛小悠,能够叫我二毛,在家中排行老二,是一名前端开发工程师。
本系列文章旨在通过练习来进步 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;
};
???? 后序
本系列会定期更新的,题目会由浅到深的逐步提高。
求关注求点赞 ????~~????????????
能够关注我的公众号:前端毛小悠。欢送浏览