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