【LeetCode刷题日记】382. 链表随机节点

2023-05-16

题目

给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。
实现 Solution 类:
Solution(ListNode head) 使用整数数组初始化对象。
int getRandom() 从链表中随机选择一个节点并返回该节点的值。链表中所有节点被选中的概率相等。

示例:
输入
["Solution", "getRandom", "getRandom", "getRandom", "getRandom", "getRandom"]
[[[1, 2, 3]], [], [], [], [], []]
输出
[null, 1, 3, 2, 2, 3]

解释
Solution solution = new Solution([1, 2, 3]);
solution.getRandom(); // 返回 1
solution.getRandom(); // 返回 3
solution.getRandom(); // 返回 2
solution.getRandom(); // 返回 2
solution.getRandom(); // 返回 3
// getRandom() 方法应随机返回 1、2、3中的一个,每个元素被返回的概率相等。
 

提示:
链表中的节点数在范围 [1, 104] 内
-104 <= Node.val <= 104
至多调用 getRandom 方法 104 次
 
进阶:
如果链表非常大且长度未知,该怎么处理?
你能否在不使用额外空间的情况下解决此问题?

题解

我们可以在初始化时,用一个数组记录链表中的所有元素,这样随机选择链表的一个节点,就变成在数组中随机选择一个元素。

C

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct {
    int * arr;
    int length;
} Solution;

Solution* solutionCreate(struct ListNode* head) {
    Solution * obj = (Solution *)malloc(sizeof(Solution));
    assert(obj != NULL);
    obj->length = 0;
    struct ListNode * node = head;

    while (node) {
        node = node->next;
        obj->length++;
    }
    obj->arr = (int *)malloc(sizeof(int) * obj->length);
    assert(obj->arr != NULL);
    node = head;
    for (int i = 0; i < obj->length; i++) {
        obj->arr[i] = node->val;
        node = node->next;
    }
    return obj;
}

int solutionGetRandom(Solution* obj) {
    return obj->arr[rand() % obj->length];
}

void solutionFree(Solution* obj) {
    free(obj->arr);
    free(obj);
}

C++

class Solution {
    vector<int> arr;

public:
    Solution(ListNode *head) {
        while (head) {
            arr.emplace_back(head->val);
            head = head->next;
        }
    }

    int getRandom() {
        return arr[rand() % arr.size()];
    }
};

Java

class Solution {
    List<Integer> list;
    Random random;

    public Solution(ListNode head) {
        list = new ArrayList<Integer>();
        while (head != null) {
            list.add(head.val);
            head = head.next;
        }
        random = new Random();
    }

    public int getRandom() {
        return list.get(random.nextInt(list.size()));
    }
}

比较一下这几种语言,有时候看着C语言的*和->还挺烦的.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【LeetCode刷题日记】382. 链表随机节点 的相关文章

随机推荐

  • 【LeetCode刷题日记】306. 累加数

    题目 累加数 是一个字符串 xff0c 组成它的数字可以形成累加序列 一个有效的 累加序列 必须 至少 包含 3 个数 除了最开始的两个数以外 xff0c 字符串中的其他数都等于它之前两个数相加的和 给你一个只包含数字 39 0 39 39
  • Linux文本处理grep详解

    在 Linux 中 xff0c 文本处理无非是对文本内容做查看 修改等操作 本章将介绍Linux中常用的文本处理命令 xff0c 以及被称为Linux三剑客的 grep sed 和 awk 命令 有读者可能会问 xff0c 处理文本内容 x
  • Linux Shell基础教程

    文章目录 Shell简介 xff1a 1分钟理解什么是ShellShell 是一种脚本语言 Shell对于运维人员的重要性Shell Python 和 Perl1 Perl 语言2 Python 语言3 Shell 几种常见的Shell x
  • git快速入门(3)__ 分支创建、切换和合并

    1 理解分支 为了便于理解 xff0c 大家可以粗略的将分支认为就是一个代码的副本 如果我们同时在一个代码上开发多个功能 还要修改一些bug xff0c 团队成员协作过程中 xff0c 必然会出现相互影响 假如某个同事提交了一个错误的代码
  • Tomcat10 出错: Javax.servlet.*不存在,因为包名改了

    改包名了 xff01 改包名了 xff01 改包名了 xff01 改包名了 xff01 改包名了 xff01 span class token keyword package span com span class token punctu
  • 解决Address localhost:1099 is already in use

    分享一篇好文 xff1a 解决Address localhost 1099 is already in use
  • 使用IDEA创建servlet JavaWeb 应用及使用Tomcat本地部署

    文章目录 需要安装好的软件背景知识 Servlet是什么 xff1f 背景知识 JavaWeb应用的目录结构1 新建一个java项目2 将普通java项目转换成JavaWeb项目3 进行项目目录结构的设置4 引入Tomcat的jar包5 简
  • 【LeetCode刷题日记】334. 递增的三元子序列

    题目 给你一个整数数组 nums xff0c 判断这个数组中是否存在长度为 3 的递增子序列 如果存在这样的三元组下标 i j k 且满足 i lt j lt k xff0c 使得 nums i lt nums j lt nums k xf
  • 2022年给正在创作的程序员的实用工具

    文章目录 视频处理音频处理截图 xff0f 图片处理笔记 xff0f 思维导图录屏阿虚的笔记方案 xff08 永久保存文章 xff09 OCR图片文字识别稍后阅读 xff0f 笔记 xff0f 日记 xff0f 记账音频编辑 xff0f 变
  • 【LeetCode刷题日记】373. 查找和最小的K对数字

    题目 给定两个以升序排列的整数数组 nums1 和 nums2 以及一个整数 k 定义一对值 u v xff0c 其中第一个元素来自 nums1 xff0c 第二个元素来自 nums2 请找到和最小的 k 个数对 u1 v1 u2 v2 u
  • IDEA2021新建第一个Spring项目(使用两种方法)

    文章目录 软件版本Spring开发环境搭建 xff0c 软件安装Apache Common Logging APISpring使用两种方法来创建Spring项目1 1使用IDEA新建一个普通项目1 2导入Spring包1 3新建两个java
  • 如何把苍白的一年写成耀眼的年终报告?写完当场加薪的那种

    毕导的文章简直太好玩了 xff1a https mp weixin qq com s Q qd2ky6AoKM1Dn3cC9q9w 啊 xff01 光阴似箭 xff0c 日月如梭 xff01 不知不觉我在公众号写了一年了 xff0c 你也到
  • 【每天一个 Linux 命令】网络相关命令(ifconfig、route、ping、traceroute、netstat、ss、telnet、rcp、scp)

    文章目录 ifconfig命令ifconfig命令使用示例route命令语法route命令使用示例ping命令语法ping命令使用示例traceroute命令语法traceroute命令使用示例netstat命令语法netstat命令使用示
  • Windows常用CMD命令

    参考下面几篇博客 xff1a Windows 用户需要知道的 CMD 常用命令总结 CMD常用命令大全 CMD常用命令
  • PIXHAWK飞行模式

    PIXHAWK飞行模式 从mission planner中设置pixhawk的飞行模式时 xff0c 一共给出了多种飞行模式 xff0c 分别为 xff1a MANUAL STABILIZED ACRO RATTITUDE ALTCTL P
  • FileZilla 通过sftp(ssh)协议远端登录Linux虚拟机

    FileZilla nbsp 通过sftp ssh 协议远端登录Linux虚拟机 参考网址 1 Filezilla连接虚拟机Ubuntu16 04传输文件 生命长跑的博客 CSDN博客 2 问题解决手记 VMWare虚拟机与本地主机不能互p
  • 【Python学习笔记】Python学习资料汇总

    不懂算法的程序员不是好程序员 xff0c 学习Python xff0c 可以更好的使用算法 xff0c 使用ML DL来处理数据 这篇文章就对自己觉得不错的学习资料进行汇总 Python基础教程 xff0c Python入门教程 xff08
  • 【LeetCode刷题日记】1716. 计算力扣银行的钱

    题目 Hercy 想要为购买第一辆车存钱 他 每天 都往力扣银行里存钱 最开始 xff0c 他在周一的时候存入 1 块钱 从周二到周日 xff0c 他每天都比前一天多存入 1 块钱 在接下来每一个周一 xff0c 他都会比 前一个周一 多存
  • 美团人的写作基本功是如何练成的

    在美团 xff0c 王兴非常重视写作 他曾经说过 xff1a 写作是我要带头苦练的基本功 xff0c 是非常基本的能力 因为一个事情要积累的话 xff0c 就得书面化 写作看起来和业务没什么关系 xff0c 但这是一个非常共通的 极其基础的
  • 【LeetCode刷题日记】382. 链表随机节点

    题目 给你一个单链表 xff0c 随机选择链表的一个节点 xff0c 并返回相应的节点值 每个节点 被选中的概率一样 实现 Solution 类 xff1a Solution ListNode head 使用整数数组初始化对象 int ge