我正在尝试在Java中找到LinkedList中最接近的数字。我想出了对LinkedList进行排序的代码(在我的例子中填充了0-300的随机数),然后遍历循环,将整数“最接近”设置为排序列表中最接近的前一个数字。但是,当最接近的数字大于起始数字但是比前一个数字更接近时,我遇到了一个问题,因为我的代码没有检查更大的数字是否更接近。我如何检查更高的数字是否比上一个数字更接近?
如果答案很清楚,我很抱歉,我对Java很陌生,而且我一直试图解决这个问题,因为我的思绪一直空白。我假设答案与两者之间的差异的绝对值有关,但我很难过。
LinkedList<Integer> list = new LinkedList<Integer>();
int starting = number.nextInt(300);
int nearest = 0;
Collections.sort(list);
for (int i = 0; i < list.size(); i++)
{
if (list.get(i) <= starting)
{
nearest = list.get(i);
}
}
System.out.print("The closest element of the list is " + nearest + ".");
答案 0 :(得分:1)
您无需对数字进行排序即可找到最接近目标的数字。只需搜索与您的目标最接近的绝对差异。这是Java 8的单行代码:
Integer result = integers
.stream()
.min(Comparator.comparing(x -> Math.abs(x - goal)))
.orElse(null);
这基本上是O(n)
。排序通常类似O(n*log n)
,所以除非你需要为其他目的排序数组,否则从时间复杂度POV排序是不合理的。
答案 1 :(得分:0)
您可以存储任何数字与起始数字之间找到的最低差异(到目前为止)。这可以通过使用Math.abs
获取两个数字之间的绝对值来完成。
您可以根据最低差异选择最接近的数字。
int diff = Integer.MAX_VALUE;
for (int i = 0; i < list.size(); i++) {
if (Math.abs(starting - list.get(i)) < diff) {
nearest = list.get(i);
diff = Math.abs(starting - list.get(i));
}
}
System.out.print("The closest element of the list is " + nearest + ".");
如果有两种可能的选择,这将选择较低的数字。
示例: [9,10,11],你从10开始,这将选择9。
要选择11,只需在<
条件中将<=
更改为if
答案 2 :(得分:0)
假设您找到了与starting
值最接近的值。
您无需对列表进行排序。
试试这个:
int nearest = 0;
int distance = Integer.MAX_VALUE;
for (int i : list) {
int d = Math.abs(i - starting);
if (d < distance) {
nearest = i;
distance = d;
}
}
System.out.print("The closest element of the list is " + nearest + ".");