我想在循环顺序中找到两个数字之间的最短距离,例如0到6:
... 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 ...
在还需要知道哪个“方式”更短(向左或向右)。
因此,如果我的两个数字分别为0和6,则通过向后(向左)计数,最短距离为1。
以下功能有效,但前提next
是必须大于crt
。
var MAX_NUMBER = 6; // 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3 4 5 6
function shorterDirection(crt, next) {
var toRight = next - crt;
var toLeft = MAX_NUMBER - (next - crt - 1);
return toLeft < toRight ? 'left' : 'right';
}
console.log(shorterDirection(0, 6));
我不知道如何使其双向工作。例如,如果使用shorterDirection(4, 3)
,我希望函数返回left
。
您可以使用此:
function shorterDirection(crt, next) {
var toRight = (next + MAX_NUMBER+1 - crt) % (MAX_NUMBER+1);
return toRight > (MAX_NUMBER+1) / 2 ? 'left' : 'right';
}
请注意,可以有联系。在这种情况下,以上方法将返回left
,即使效果right
一样好。
如您所见,里面有很多东西MAX_NUMBER+1
。如果您有一个常数NUMBER_COUNT
,它将比MAX_NUMBER
现在的常数大一个更合适。
您将首先编写以下代码:
var toRight = next - crt;
但是,当next小于crt时,这是“错误的” -您得到一个负数。为了解决这个问题,您可以添加MAX_NUMBER+1
:
var toRight = next + NUMBER+1 - crt;
...但是现在当next大于crt时,您得到的数字太大。您可以通过减去NUMBER+1
所需的尽可能多的值来解决,以达到0 ... MAX_NUMBER范围。这就是取模(%
)运算符的作用。因此,您得到:
var toRight = (next + MAX_NUMBER+1 - crt) % (MAX_NUMBER+1);
获得该结果后,您可以推断出,如果需要花费一半以上的数字去右边,那么最好去左边(那将少于一半的数目)。编码为:
return toRight > (MAX_NUMBER+1) / 2 ? 'left' : 'right';
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句