在平局的情况下,我如何 return javascript 中较小的数字?
In the case of a tie, how do I return the smaller number in javascript?
我需要编写一个接受两个输入的函数,'target'(整数)和 'values'(整数列表),并找出 'values' 中的哪个数字最接近'target'。我想出了以下内容:
var targetNum = 0;
var valuesArr = [2, 4, 6, 8, 10];
function closestToTarget(target, values) {
var currVal = values[0];
var diff = Math.abs(target - currVal);
for (var i = 0; i < values.length; i++) {
var currDiff = Math.abs(target - values[i]);
if (currDiff < diff) {
diff = currDiff;
currVal = values[i];
}
}
return currVal;
}
alert(closestToTarget(targetNum, valuesArr));
该函数有效,但我无法 return 在平局的情况下使用较小的值。我能想到的最好的是以下不起作用:
function closestToTarget(target, values) {
var currVal = values[0];
var diff = Math.abs(target - currVal);
for (var i = 0; i < values.length; i++) {
var currDiff = Math.abs(target - values[i]);
if (currDiff < diff) {
diff = currDiff;
currVal = values[i];
}
else if (currDiff == diff) {
return Math.min[currVal, values[i]];
}
else {
return currVal[i - 1];
}
}
return currVal;
}
在平局的情况下,我如何 return JavaScript 中较小的数字?
您的代码看起来可以工作尝试将 Math.min[currVal, values[i]]
更改为 Math.min(currVal, values[i])
如果您的值是有序的(简单的语法问题)应该可以工作。
正如 kojow7 所提到的,只要 values
被排序,第一个函数也应该可以工作。
否则,您应该尝试执行 currVal = Math.min(...)
而不是 return Math.min(...)
并继续迭代,然后在循环后返回 currVal
。这只是确保您检查 values
数组中的每个值以确保您没有遗漏任何内容(但如果已订购,则无需继续检查,因为差异只会增加)。
诀窍在于,当您找到新的最佳差异并记录差异 (bestDiff
) 时,您还会记录导致该差异的值 (bestVal
)。
所以现在,如果遇到平局(currDiff == bestDiff
),你需要检查它是否是更好的平局,即检查当前值是否为小于记录的 (currVal < bestVal
)。如果是,那么我们更新最佳值(同时更新 bestDiff
和 bestVal
)。
function closestToTarget(target, values) {
var currVal = values[0];
var bestDiff = Math.abs(target - currVal);
var bestVal = currVal;
for (var i = 1; i < values.length; i++) {
var currVal = values[i];
var currDiff = Math.abs(target - values[i]);
if (currDiff < bestDiff || (currDiff == bestDiff && currVal < bestVal)) {
bestDiff = currDiff;
bestVal = currVal;
}
}
return bestVal;
}
示例:
closestToTarget(2,[2,4,6,8,10]) // 2
closestToTarget(2,[10,8,6,4,2]) // 2
closestToTarget(3,[10,8,6,4,2]) // 2
你的想法应该可行,但你也可以使用你的第一个函数,但在最后添加一些检查较低领带的东西:
function closestToTarget(target, values) {
var currVal = values[0];
var diff = Math.abs(target - currVal);
for (var i = 0; i < values.length; i++) {
var currDiff = Math.abs(target - values[i]);
if (currDiff < diff) {
diff = currDiff;
currVal = values[i];
}
}
// We found the closest but now check if there's a smaller tie
if (currVal > target && values.indexOf(target - diff) > -1 ) {
return target - diff;
}
else {
// if not just return what we originally found
return currVal;
}
}
除了语法错误(缺少括号)之外,您可以使用一些 ES6 语法来编写更简洁的函数:
function closestToTarget(target, values) {
const m = Math.min(...values.map( v => Math.abs(target - v)));
return Math.min(...values.filter( v => Math.abs(target - v) === m ));
}
var valuesArr = [2, 4, 6, 8, 10];
// Try several numbers
for (var i = 1; i < 12; i++) {
console.log(i, closestToTarget(i, valuesArr));
}
.as-console-wrapper { max-height: 100% !important; top: 0; }
function findClosest(inpt, ar) {
var minDiff = Math.abs(ar[0] - inpt);
var res = ar[0];
for (var i = 1; i < ar.length; i++) {
if(Math.abs((ar[i] - inpt)) < minDiff)
res = ar[i];
}
return res;
}
这是一个关于如何为给定输入获取数组中最接近值的简单示例。
如果出现平局,则 return 不会有更低的数字。如果您在数组中有多个最接近的整数,则对于所有平局情况,您的输入之间的差异是相同的。所以不用担心。
我需要编写一个接受两个输入的函数,'target'(整数)和 'values'(整数列表),并找出 'values' 中的哪个数字最接近'target'。我想出了以下内容:
var targetNum = 0;
var valuesArr = [2, 4, 6, 8, 10];
function closestToTarget(target, values) {
var currVal = values[0];
var diff = Math.abs(target - currVal);
for (var i = 0; i < values.length; i++) {
var currDiff = Math.abs(target - values[i]);
if (currDiff < diff) {
diff = currDiff;
currVal = values[i];
}
}
return currVal;
}
alert(closestToTarget(targetNum, valuesArr));
该函数有效,但我无法 return 在平局的情况下使用较小的值。我能想到的最好的是以下不起作用:
function closestToTarget(target, values) {
var currVal = values[0];
var diff = Math.abs(target - currVal);
for (var i = 0; i < values.length; i++) {
var currDiff = Math.abs(target - values[i]);
if (currDiff < diff) {
diff = currDiff;
currVal = values[i];
}
else if (currDiff == diff) {
return Math.min[currVal, values[i]];
}
else {
return currVal[i - 1];
}
}
return currVal;
}
在平局的情况下,我如何 return JavaScript 中较小的数字?
您的代码看起来可以工作尝试将 Math.min[currVal, values[i]]
更改为 Math.min(currVal, values[i])
如果您的值是有序的(简单的语法问题)应该可以工作。
正如 kojow7 所提到的,只要 values
被排序,第一个函数也应该可以工作。
否则,您应该尝试执行 currVal = Math.min(...)
而不是 return Math.min(...)
并继续迭代,然后在循环后返回 currVal
。这只是确保您检查 values
数组中的每个值以确保您没有遗漏任何内容(但如果已订购,则无需继续检查,因为差异只会增加)。
诀窍在于,当您找到新的最佳差异并记录差异 (bestDiff
) 时,您还会记录导致该差异的值 (bestVal
)。
所以现在,如果遇到平局(currDiff == bestDiff
),你需要检查它是否是更好的平局,即检查当前值是否为小于记录的 (currVal < bestVal
)。如果是,那么我们更新最佳值(同时更新 bestDiff
和 bestVal
)。
function closestToTarget(target, values) {
var currVal = values[0];
var bestDiff = Math.abs(target - currVal);
var bestVal = currVal;
for (var i = 1; i < values.length; i++) {
var currVal = values[i];
var currDiff = Math.abs(target - values[i]);
if (currDiff < bestDiff || (currDiff == bestDiff && currVal < bestVal)) {
bestDiff = currDiff;
bestVal = currVal;
}
}
return bestVal;
}
示例:
closestToTarget(2,[2,4,6,8,10]) // 2
closestToTarget(2,[10,8,6,4,2]) // 2
closestToTarget(3,[10,8,6,4,2]) // 2
你的想法应该可行,但你也可以使用你的第一个函数,但在最后添加一些检查较低领带的东西:
function closestToTarget(target, values) {
var currVal = values[0];
var diff = Math.abs(target - currVal);
for (var i = 0; i < values.length; i++) {
var currDiff = Math.abs(target - values[i]);
if (currDiff < diff) {
diff = currDiff;
currVal = values[i];
}
}
// We found the closest but now check if there's a smaller tie
if (currVal > target && values.indexOf(target - diff) > -1 ) {
return target - diff;
}
else {
// if not just return what we originally found
return currVal;
}
}
除了语法错误(缺少括号)之外,您可以使用一些 ES6 语法来编写更简洁的函数:
function closestToTarget(target, values) {
const m = Math.min(...values.map( v => Math.abs(target - v)));
return Math.min(...values.filter( v => Math.abs(target - v) === m ));
}
var valuesArr = [2, 4, 6, 8, 10];
// Try several numbers
for (var i = 1; i < 12; i++) {
console.log(i, closestToTarget(i, valuesArr));
}
.as-console-wrapper { max-height: 100% !important; top: 0; }
function findClosest(inpt, ar) {
var minDiff = Math.abs(ar[0] - inpt);
var res = ar[0];
for (var i = 1; i < ar.length; i++) {
if(Math.abs((ar[i] - inpt)) < minDiff)
res = ar[i];
}
return res;
}
这是一个关于如何为给定输入获取数组中最接近值的简单示例。 如果出现平局,则 return 不会有更低的数字。如果您在数组中有多个最接近的整数,则对于所有平局情况,您的输入之间的差异是相同的。所以不用担心。