编写一个名为minGap的方法,返回整数列表中相邻值之间的最小间距。列表中两个相邻值之间的差距被定义为第二个值减去第一个值。例如,假设一个名为list的变量存储这些值:
[1, 3, 6, 7, 12]
第一个间隙为2(3-1),第二个间隙为3(6-3),第三个间隙为1(7-6),第四个间隙为5(12-7)。因此,调用:list.minGap()
应该返回1,因为这是最小的差距。请注意,最小差距可能是一个负数。例如,如果列表存储以下内容:[3, 5, 11, 4, 8]
,缺口为2(5-3)、6(11-5)、-7 (4-11)和4(8-4)。在这些值中,-7最小,因此它将被返回。如果列表中的元素少于2个,则方法应该返回0。您正在为LinkedIntList类编写一个方法: public类ListNode { public int data;//数据存储在此节点下一个公共ListNode中;//链接到列表 }公共类LinkedIntList {私有ListNode前端中的下一个节点; }您的方法不应该修改列表内容,并且需要在O(n)时间内运行,其中n是列表的长度。您不能调用LinkedIntList类的任何其他方法,也不能构造任何结构化对象来解决这个问题。
我不确定通过将int minGap
设置为Integer.MAX_VALUE
来检查最小值是否正确(如果这样做不好,请告诉我)。我想更好地解决这些问题,所以任何能使我的代码更易读或更容易编写的技巧都是很棒的!在解决这个问题之前,我对使用多个链接列表的引用不太了解,所以对于将来解决这些问题的任何建议都是非常感谢的。
public int minGap() {
if (front == null || front.next == null) {
return 0;
}
int minGap = Integer.MAX_VALUE;
ListNode prev = front;
ListNode p = front.next;
while (p != null) {
int checkGap = p.data - prev.data;
if (checkGap < minGap) {
minGap = checkGap;
}
prev = p;
p = p.next;
}
return minGap;
}
发布于 2017-11-28 19:43:25
您不需要存储整个前一个节点,只需要存储值。此外,您还可以用min
代替检查差距是否更小,尽管这主要是因为口味问题。p
是一个相当不透明的变量名。
public int minGap() {
if (front == null || front.next == null) {
return 0;
}
int minGap = Integer.MAX_VALUE;
int lastValue = front.data;
ListNode currentNode = front.next;
while (currentNode != null) {
minGap = min(minGap, currentNode.data-lastValue);
lastValue = currentNode.value;
currentNode = currentNode.next;
}
return minGap;
}
发布于 2017-11-28 17:32:33
由于您已经检查了front.next
是非空的,所以您可以重新安排您的初始化并将minGap
初始化为:
...
ListNode prev = front;
ListNode p = front.next;
int minGap = p.data - prev.data;
...
这将使循环的第一次迭代大部分是多余的,但确保minGap
始终是一个有效的间隙值。
发布于 2017-11-28 17:38:26
您可以将其初始化为"error“值,然后使用另一个变量强制在第一个循环迭代中替换它。另外,由于它被初始化为"error“值,所以可以跳过其中一个错误检查条件。
public int minGap() {
int minGap = 0;
int firstCheck = 1;
ListNode prev = front;
if (prev == null) { return minGap; }
ListNode p = front.next;
while (p != null) {
int checkGap = p.data - prev.data;
if (checkGap < minGap || firstCheck == 1) {
minGap = checkGap;
firstCheck = 0;
}
prev = p;
p = p.next;
}
return minGap;
}
在这种安排中,我们将在分配给prev
和p
之后立即检查它们的null
,因此保持null
检查的一致性有点容易(例如,如果front.next
被重构为其他名称,那么您有两个位置来更改它,而不是三个)。
https://codereview.stackexchange.com/questions/181504
复制相似问题