样本输入= 10 -20 -3916237 -357920 -3620601 7374819 -7330761 30 6246457 -6461594 266854
示例输出= -20 30
提前谢谢 我是编程的初学者class Main {
public static void main(String[] args) {
int _a_size = Integer.parseInt(args[0]);
Assert.assert2(args.length,_a_size+1);
int[] _a = new int[_a_size];
for(int _a_i = 0;_a_i<_a_size;_a_i++) {
_a[_a_i] = Integer.parseInt(args[_a_i+1]);
}
Operation.minDiffrence (_a);
}
}
答案 0 :(得分:2)
你可以做到
public static List<int[]> minDifference(int[] values) {
Arrays.sort(values); // O(N log N)
List<int[]> results = new ArrayList<>();
long minDiff = Long.MAX_VALUE;
for(int i = 0; i < values.length-1;i++) {
long diff = Math.abs((long) values[i+1] - values[i]);
if (diff < minDiff) {
results.clear();
minDiff = diff;
}
if (diff == minDiff)
results.add(Array.copyOfRange(values, i, 2));
}
return results;
}
这样做是为了保持迄今为止最短的所有结果,如果找到一个简短的结果,它会丢弃旧的结果。您将返回一组由等分的值组成的列表。
注意:计算以long
执行以避免溢出。
答案 1 :(得分:0)
我知道这是一个老问题,但这是一个有效的Java 8解决方案:
Map<Integer, List<List<Integer>>> map = list.stream().flatMap(i -> list.stream()
.map(i2 -> (i.equals(i2) || i > i2) ? null : Arrays.asList(i, i2)))
.filter(ints -> ints != null)
.collect(Collectors.groupingBy(o -> Math.abs(o.get(1) - o.get(0))));
在SO的代码显示中看起来有点难看,但在我的IDE中它非常适合3行。它返回一个映射,其中键是绝对差值,值是相应数字对的列表(因为可能有多个)。
你可能不再需要它了,但是玩游戏总是很有趣。