首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在链表中找到相邻元素之间的最小间距(差)。

在链表中找到相邻元素之间的最小间距(差)。
EN

Code Review用户
提问于 2017-11-28 16:42:21
回答 3查看 1.2K关注 0票数 2

编写一个名为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来检查最小值是否正确(如果这样做不好,请告诉我)。我想更好地解决这些问题,所以任何能使我的代码更易读或更容易编写的技巧都是很棒的!在解决这个问题之前,我对使用多个链接列表的引用不太了解,所以对于将来解决这些问题的任何建议都是非常感谢的。

代码语言:javascript
运行
复制
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;
}
EN

回答 3

Code Review用户

回答已采纳

发布于 2017-11-28 19:43:25

您不需要存储整个前一个节点,只需要存储值。此外,您还可以用min代替检查差距是否更小,尽管这主要是因为口味问题。p是一个相当不透明的变量名。

代码语言:javascript
运行
复制
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;
}
票数 3
EN

Code Review用户

发布于 2017-11-28 17:32:33

由于您已经检查了front.next是非空的,所以您可以重新安排您的初始化并将minGap初始化为:

代码语言:javascript
运行
复制
...
ListNode prev = front;
ListNode p = front.next;
int minGap = p.data - prev.data;
...

这将使循环的第一次迭代大部分是多余的,但确保minGap始终是一个有效的间隙值。

票数 2
EN

Code Review用户

发布于 2017-11-28 17:38:26

您可以将其初始化为"error“值,然后使用另一个变量强制在第一个循环迭代中替换它。另外,由于它被初始化为"error“值,所以可以跳过其中一个错误检查条件。

代码语言:javascript
运行
复制
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;
}

在这种安排中,我们将在分配给prevp之后立即检查它们的null,因此保持null检查的一致性有点容易(例如,如果front.next被重构为其他名称,那么您有两个位置来更改它,而不是三个)。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/181504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档