LeetCode 382. Linked List Random Node

简介: 给定一个单链表,随机选择链表的一个节点,并返回相应的节点值。保证每个节点被选的概率一样。

v2-f71219f24da2d6364f6c6c6c44c6b332_1440w.jpg

Description



Given a singly linked list, return a random node's value from the linked list. Each node must have the same probability of being chosen.


Follow up:

What if the linked list is extremely large and its length is unknown to you? Could you solve this efficiently without using extra space?


Example:


// Init a singly linked list [1,2,3].
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
Solution solution = new Solution(head);
// getRandom() should return either 1, 2, or 3 randomly. Each element should have equal probability of returning.
solution.getRandom();


描述



给定一个单链表,随机选择链表的一个节点,并返回相应的节点值。保证每个节点被选的概率一样。


进阶:

如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现?


示例:


// 初始化一个单链表 [1,2,3].
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
Solution solution = new Solution(head);
// getRandom()方法应随机返回1,2,3中的一个,保证每个元素被返回的概率相等。
solution.getRandom();
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-random-node
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


思路


  • 这道题的理论证明参见维基百科
  • 首先让数字 num 为链表中的头节点的值,count 置为 1;每次往后走一个节点的时候,生成一个 1 到 count 的随机数,如果生成的随机数能够整除 count,就把 num 和当前节点的值替换(条件不已经必须设置为整除 count,设为 0或者其他概率是 1/count 的数都可以),否则不替换;最后返回 num。


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-07-30 07:41:23
# @Last Modified by:   何睿
# @Last Modified time: 2019-07-30 07:46:44
import random
# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class Solution:
    def __init__(self, head: ListNode):
        """
        @param head The linked list's head.
        Note that the head is guaranteed to be not null, so it contains at least one node.
        """
        self.head = head
    def getRandom(self) -> int:
        """
        Returns a random node's value.
        """
        head = self.head
        num = head.val
        node = head.next
        count = 1
        while node:
            count += 1
            if random.randint(1, count) % count == 0:
                num = node.val
            node = node.next
        return num

源代码文件在 这里


目录
相关文章
|
4月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的长度,即节点数量。通过遍历这个属性,可以访问和处理所有节点。例如,示例代码加载"books.xml",获取所有"title"节点,并依次输出它们的第一个子节点的值。
|
5月前
|
XML JavaScript 数据格式
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。在示例中,代码加载"books.xml",然后通过`getElementsByTagName("title")`获取所有标题节点。使用`for`循环遍历这些节点,输出每个标题的文本内容。这个例子展示了如何交互式地处理XML文档中的特定标签。
|
5月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。通过遍历这个属性,如`for (i=0;i<x.length;i++)`,可以访问和处理每个节点。在示例中,代码加载"books.xml",然后获取所有"title"标签,并打印它们的子节点值。
|
4月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。在示例中,代码加载"books.xml",然后通过`getElementsByTagName("title")`获取所有标题节点。使用`for`循环遍历这些节点,输出每个标题的文本内容。
|
5月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的长度。在示例中,代码加载"books.xml",然后使用`getElementsByTagName("title")`获取所有标题节点。通过循环`x.length`,遍历并输出每个标题节点的第一个子节点的值。
|
4月前
|
XML JavaScript 数据格式
DOM 节点列表长度(Node List Length)
`length`属性表示DOM节点列表的长度。在示例中,通过加载"books.xml"到`xmlDoc`,并使用`getElementsByTagName("title")`获取所有标题节点,然后利用`for`循环遍历整个节点列表,每次迭代通过`childNodes[0].nodeValue`访问每个节点的第一个子节点的值并输出。此方法可用于处理XML或HTML文档中的节点列表。 **Markdown格式:** `length`属性表示DOM节点列表的长度。
|
4月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性定义了节点列表的长度(即节点数量)。可通过此属性遍历节点列表。
|
5月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。通过它,可以迭代列表,如示例所示:加载"books.xml",然后获取所有"title"节点。循环`x.length`,打印每个标题节点的第一个子节点的值。
|
5月前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。通过遍历这个属性,如`for (i=0; i<x.length; i++)`,可以访问和处理每个节点。在示例中,代码加载"books.xml",然后获取所有"title"节点,并打印它们的第一个子节点的值。
|
5月前
|
XML JavaScript 数据格式
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的长度,即节点数量。通过它可遍历列表,如`for(i=0; i<x.length; i++)`循环访问每个`title`节点,并输出其内容。示例展示了从"books.xml"加载XML后,获取并打印所有标题节点的值。