我如何在数组中找到最接近的数字,而不用遍历

How do I find the closest number in an array, without going over?

本文关键字:数字 遍历 最接近 数组      更新时间:2023-09-26

我正在编写一个简单的程序来确定下一班火车的时间。我有一个包含所有列车时间的数组,我只是不知道如何确定哪一个是最接近当前时间的,而不需要遍历。以下是目前为止的内容:

var d = new Date();
var hours = d.getHours();
var minutes = d.getMinutes();
var time = hours + minutes;
console.log(time);
var trainTimes = [1125, 1155, 1225, 1255, 1325, 1355, 1425, 1455, 1526, 1629, 1644, 1709];
function nextTrain(time) {
}

在函数nextTrain()中,我应该简单地做if-else语句,还是有更好的方法?

由于trainTimes数组是有序的,因此可以循环遍历它们,直到找到当前时间之后的第一个,然后中断。

function nextTrain(time) {
  for (i = 0; i<trainTimes.length; i++){
    if(trainTimes[i]>time){
     console.log("the next train is " + trainTimes[i]);
     break;
    }
  }
}
var d = new Date();
var hours = d.getHours();
var minutes = d.getMinutes();
var time = hours + minutes;
console.log(time);
// given sorted array.
var trainTimes = [1125, 1155, 1225, 1255, 1325, 1355, 1425, 1455, 1526, 1629, 1644, 1709];
// returns nth train 
function nextTrain(num, arr) {
    n = 0
    while (arr[n] <= num){ // consider < vs. <=
      n++;
    }
    return arr[n];
}
console.log(nextTrain(time,trainTimes))

灵感来源于链接

我建议你在这里做二进制搜索,因为你的数组已经排序了。您可以查看此链接了解有关实现的详细信息。

在找出当前时间在数组中的位置后,可以计算当前时间与两个最近邻居的差值。这取决于当前时间在二叉树中的位置。无论如何,这个方法是有效的。

你需要把你的小时数乘以100。

你可以尝试这样做:

nextTrain(time);
function nextTrain(time) {
    var timeFound = false;
    for(var i = 0; i < trainTimes.length; i++){
        if(time > trainTimes[i - 1] && time < trainTimes[i] && !timeFound ){
            console.log("Next train time is: " + trainTimes[i]);
            timeFound=true;
        }
    }
}

希望对你有所帮助

var d = new Date();
var hours = d.getHours();
var minutes = d.getMinutes();
var time = hours + minutes;
console.log(time);
var trainTimes = [1125, 1155, 1225, 1255, 1325, 1355, 1425, 1455, 1526, 1629, 1644, 1709];
var diff = new Array(12);
for (i = 0; i < trainTimes.length; i++) {
    diff[i] =Math.abs( time + trainTimes[i]);//difference
}
var diff_sort = diff.sort(function(a, b){return a-b});//acs sort
var nearestIndex = diff.indexOf(diff_sort[0]); 
var nearestValue = trainTimes[nearestIndex]; 
alert(nearestValue)

就用这个:

var nextTimeIndex = (trainsTimes.indexOf(time) >= trainsTimes.length) ? 0 : trainsTimes.indexOf(time) + 1;
var nextTrain = trainsTimes[nextTimeIndex];