【问题标题】:HackerRank: Inserting a Node Into a Sorted Doubly Linked List - KotlinHackerRank:将节点插入到排序的双向链表中 - Kotlin
【发布时间】:2022-01-13 17:01:10
【问题描述】:

只是想知道是否有人可以帮助我解决 Hackerrank 问题https://www.hackerrank.com/challenges/insert-a-node-into-a-sorted-doubly-linked-list/problem 的 kotlin 实现

我得出了以下解决方案,它只通过了 8 次测试中的 3 次。

我对自己做错了什么感到困惑,因为当我搜索互联网时,我发现了一个非常相似的 Java 解决方案 - https://www.geeksforgeeks.org/insert-value-sorted-way-sorted-doubly-linked-list/

任何帮助将不胜感激,我对此感到不知所措。

fun sortedInsert(llist: DoublyLinkedListNode?, data: Int): DoublyLinkedListNode? {
    val node = DoublyLinkedListNode(data)
    if (llist == null) return node
    
    if (llist.data >= data) {
        node.next = llist
        node.next!!.prev = node
        return node
    }
    
    var current = llist
    while (current?.next != null && current.next!!.data < data) {
        current = current.next
    }
    
    node.next = current?.next
    if (current?.next != null) current.next!!.prev = node
    
    node.prev = current
    current?.next = node
    
    return llist
}

【问题讨论】:

  • 我看到some commentsKotlin test harness is buggy,但它们已经有几年历史了。我的解决方案在提交时失败了 5/8 例,但在 Java 和 JS 中都接受了相同的算法。
  • 乍一看还不错,不知道hackerrank是如何测试这个的,所以错误不能出现在您的输入/输出内容或DoublyLinkedListNode中吗?另一方面,值得一提的是,返回值实际上是不可为空的,所以你可以去掉问号,对于 while(var x != null) 构造,kotlin 提供了 generateSequence 函数,它允许你在没有你的情况下处理它改变“当前”。虽然它在这里可能不一定更具可读性。

标签: algorithm kotlin linked-list doubly-linked-list


【解决方案1】:

HackerRank 的测试工具似乎无法用于 Kotlin,缺少一个 println 来分隔每个测试用例的输出。某些通过(包括示例测试)的原因是 t=1 用于这些,因此不会触发错误。

请参阅问题的discussion thread,了解有关该问题的更多投诉。一些投诉可以追溯到 2021 年 12 月的 3 年,这表明即使 HR 意识到这个问题,这也不是 HR 需要优先解决的问题。此外,该问题似乎会影响 Kotlin 中其他链表问题的样板,例如 Reverse a Doubly Linked List

这是您翻译成 Java 15 的代码,它通过了 HackerRank 的评判:

public static DoublyLinkedListNode sortedInsert(
    DoublyLinkedListNode llist, int data
) {
    var node = new DoublyLinkedListNode(data);
    if (llist == null) return node;
    
    if (llist.data >= data) {
        node.next = llist;
        node.next.prev = node;
        return node;
    }
    
    var current = llist;
    while (current.next != null && current.next.data < data) {
        current = current.next;
    }
    
    node.next = current.next;
    if (current.next != null) current.next.prev = node;
    
    node.prev = current;
    current.next = node;
    return llist;
}

【讨论】:

  • 非常感谢您的回复。我也做了这个Q,不明白为什么它没有通过所有测试。
猜你喜欢
  • 2019-12-05
  • 2011-07-21
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多