【问题标题】:How to find the next greater number and next lower number in an array [closed]如何在数组中找到下一个较大的数字和下一个较小的数字[关闭]
【发布时间】:2020-07-30 23:23:39
【问题描述】:

最初,我有一个值,比如说100

然后我还有一个包含[99, 101, 102, 103, 98, 95, 97]等元素的数组

我想要什么,我想要一个新数组的第一个元素最接近值 100 那是101 & 99 然后下一个最接近的值是102 & 98 等等。

所以最终的数组应该是这样的[99, 101, 98, 102, 97, 103, 95]

那么在 php 中我该如何解决这个问题呢?

这个问题有什么具体的算法吗?

【问题讨论】:

  • 您可以遍历[99, 101, 102, 103, 98, 95, 97] 的所有元素并计算一种分数:abs(100-array[i])。该分数将表示元素与数字 100 的距离。然后您将根据该分数对原始数组进行排序。
  • 如果有10,000记录怎么办?
  • 那么较小的数字呢。因为99 & 101 都在同一个位置。

标签: php algorithm sorting


【解决方案1】:

您可以使用usort 来按您定义的函数对数组进行排序。正如@Pedro Pinheiro 在 cmets 中提到的那样,您可以计算分数,该分数表示元素与 100 的距离,这正是 usort 得到的。

所以你的代码可以是:

<?php
function sort_100($a,$b)
{
if ($a==$b) return 0;
return (abs(100-($a))<abs(100-($b))?-1:1;
}

$a=array(99, 101, 102, 103, 98, 95, 97);
usort($a,"sort_100");
?>

【讨论】:

  • 这也有效!!!但是我无法在 usort 中传递变量。您可能知道 100 是可变的。
【解决方案2】:

您可以简单地在关联数组中收集数字,键为差异与 100。稍后,您可以执行ksort() 以根据差异对它们进行排序。这样一来,在许多普通情况下,您的分拣成本将是最低的。

<?php

$a = array(99, 95, 101, 102, 103, 98, 97, 110);

$number = 100;
$diff = [];

foreach($a as $ele){
    $diff[abs($number - $ele)][] = $ele;
}

ksort($diff,SORT_NUMERIC);
print_r($diff);

演示: https://3v4l.org/QPX1o

【讨论】:

  • 你能告诉我上面这段代码的效率吗?例如,假设我在一个数组中有超过 1000 个元素,它将工作多远?
  • @DanishTahir 该代码的时间复杂度为k log(k) + O(n),其中k 是唯一差异的数量,n 是数组的长度。在大小为 1000 的数组上,它应该很快。
猜你喜欢
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2012-03-20
相关资源
最近更新 更多