题目有一棵根节点为 0 的 家族树 ,总共包含 n 个节点,节点编号为 0 到 n - 1 。给你一个下标从 0 开始的整数数组 parents ,其中 parents[i] 是节点 i 的父节点。由于节点 0 是 根 ,所以 parents[0] == -1 。
总共有 105 个基因值,每个基因值都用 闭区间 [1, 105] 中的一个整数表示。给你一个下标从 0 开始的整数数组 nums ,其中 nums[i] 是节点 i 的基因值,且基因值 互不相同 。
请你返回一个数组 ans ,长度为 n ,其中 ans[i] 是以节点 i 为根的子树内 缺失 的 最小 基因值。
节点 x 为根的 子树 包含节点 x 和它所有的 后代 节点。
示例 1:
1234567输入:parents = [-1,0,0,2], nums = [1,2,3,4]输出:[5,1,1,1]解释:每个子树答案计算结果如下:- 0:子树包含节点 [0,1,2,3] ,基因值分别为 [1,2,3,4] 。5 是缺失的最小基因值。- 1:子树只包含节点 1 ,基因值为 2 。1 是缺失的最小基因值。- 2:子树 ...
经典书籍学习
未读
为什么要使用模板?
C++要求我们要用特定的类型来声明变量,函数以及其他一些内容。这样很多代码可能就只是处理的变量类型有所不同。比如对不同的数据类型,quicksort 的算法实现在结构上可能完全一样,不管是对整形的 array,还是字符串类型的 vector,只要他们所包含的内容之间可以相互比较。
如果你所使用的语言不支持这一泛型特性,你将可能只有如下糟糕的选择:
你可以对不同的类型一遍又一遍的实现相同的算法。
你可以在某一个公共基类(commonbasetype,比如 Object 和 void*)里面实现通用的算法代码。
你也可以使用特殊的预处理方法。
如果你是从其它语言转向 C++,你可能已经使用过以上几种或全部的方法了。然而他们都各有各的缺点:
如果你一遍又一遍地实现相同算法,你就是在重复地制造轮子!你会犯相同的错误,而 且为了避免犯更多的错误,你也不会倾向于使用复杂但是很高效的算法。
如果在公共基类里实现统一的代码,就等于放弃了类型检查的好处。而且,有时候某些 类必须要从某些特殊的基类派生出来,这会进一步增加维护代码的复杂度。
如果采用预处理的方式,你需要实现一 ...
经典书籍学习
未读一个系统中的进程是与其他进程共享 CPU 和主存资源的。然而,共享主存会形成一些特殊的挑战。随着对 CPU 需求的增长,进程以某种合理的平滑方式慢了下来。但是如果太多的进程需要太多的内存,那么它们中的一些就根本无法运行。当一个程序没有空间可用时,那就是它运气不好了。内存还很容易被破坏。如果某个进程不小心写了另一个进程使用的内存,它就可能以某种完全和程序逻辑无关的令人迷惑的方式失败。
为了更加有效地管理内存并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。通过一个很清晰的机制,虚拟内存提供了三个重要的能力:
它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。
它为每个进程提供了一致的地址空间,从而简化了内存管理。
它保护了每个进程的地址空间不被其他进程破坏。
虚拟内存是计算机系统最重要的概念之一。它成功的一个主要原因就是因为它是沉默地、自动地工作 ...
开发笔记
未读class类的非常量数据成员均应该是private类的数据成员均应设为 private,对外统一由成员函数提供访问方法,且应避免返回 private 成员的非常量引用或指针。
将类的所有接口都实现为成员函数,由成员函数按指定逻辑读写数据,以便保证有效地改变对象状态。良好的接口设计会对代码的职责进行合理划分,显著提升可维护性。理想状态下,当有错误需要修正或有功能需要调整时,只改动相关接口的实现即可,调用接口的代码不需要改动,从而将改动降到最低。这种设计的基础便是将数据设为 private,只能由本类的成员函数访问,否则数据可被各个模块随意读写,当有一处需要改动时,很难控制其影响范围。
常量数据成员不可被改变,所以可不受本规则约束。
示例:
123456struct A { int *p, n; // Non-compliant A(int n): p(new int[n]), n(n) {} ~A() { delete[] p; }};
例中类的数据成员 p 指向动态分配的内存区域,n 记录区域大 ...
题目给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 。计算并返回该研究者的 h 指数。
h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。
请你设计并实现对数时间复杂度的算法解决此问题。
示例 1:
1234输入:citations = [0,1,3,5,6]输出:3解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 0, 1, 3, 5, 6 次。 由于研究者有3篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3 。
示例 2:
12输入:citations = [1,2,100]输出:2
提示:
n == citations.length
1 <= n <= 105
0 <= citations[i] <= 1000
citations 按 升序排列
解答左闭 ...
实验概览需要我们实现的函数:
eval:解析命令行 [约 70 行]
builtin_cmd:检测是否为内置命令quit、fg、bg、jobs[约 25 行]
do_bgfg:实现内置命令bg和fg[约 50 行]
waitfg:等待前台作业执行完成 [约 20 行]
sigchld_handler:处理SIGCHLD信号,即子进程停止或者终止 [约 80 行]
sigint_handler:处理SIGINT信号,即来自键盘的中断ctrl-c[约 15 行]
sigtstp_handler:处理SIGTSTP信号,即来自终端的停止信号 [约 15 行]
作者提供的帮助函数及功能:
1234567891011121314151617181920/* Here are helper routines that we've provided for you */int parseline(const char *cmdline, char **argv); //解析命令行参数,如果后台运行则返回 1void sigquit_handler(int sig);void clea ...
题目给定一个长度为 n 的整数数组 nums 。
假设 arrk 是数组 nums 顺时针旋转 k 个位置后的数组,我们定义 nums 的 旋转函数 F 为:
F(k) = 0 * arrk[0] + 1 * arrk[1] + ... + (n - 1) * arrk[n - 1]
返回 F(0), F(1), ..., F(n-1)中的最大值 。
生成的测试用例让答案符合 32 位 整数。
示例 1:
12345678输入: nums = [4,3,2,6]输出: 26解释:F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23F(3) = (0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) = 0 + 2 + 12 + ...
全局名称应遵循合理的命名方式全局名称应具有标识性,长度不应过短,否则易与局部名称产生冲突。
本规则是 ID_badName 的特化。
示例:
12345678// In global scopeconst int i = 0; // Non-compliant, name too shorttypedef int t; // Non-compliant, name too shortclass A { .... }; // Non-compliant, name too shortint foo(int i) { return i + i; // Confusing}
名称适用的作用域范围越广,其长度也应该越长,建议全局名称长度不小于 3 个字符。
为代码设定合理的命名空间命名空间是 C++ 项目的必要组成结构,可有效规避名称冲突等问题。
C++ 代码的顶层作用域应为具名非内联命名空间,命名空间名称应与项目名称相符,且具有标识性。
示例:
123456789101112131415161718 ...
题目给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。
根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用 h 次。如果 h 有多种可能的值,h 指数 是其中最大的那个。
示例 1:
1234输入:citations = [3,0,6,1,5]输出:3 解释:给定数组表示研究者总共有 5 篇论文,每篇论文相应的被引用了 3, 0, 6, 1, 5 次。 由于研究者有 3 篇论文每篇 至少 被引用了 3 次,其余两篇论文每篇被引用 不多于 3 次,所以她的 h 指数是 3。
示例 2:
12输入:citations = [1,3,1]输出:1
提示:
n == citations.length
1 <= n <= 5000
0 <= citations[i] <= 1000
解答12345678910111213class Solution {public ...
题目给你一个整数数组 gifts ,表示各堆礼物的数量。每一秒,你需要执行以下操作:
选择礼物数量最多的那一堆。
如果不止一堆都符合礼物数量最多,从中选择任一堆即可。
选中的那一堆留下平方根数量的礼物(向下取整),取走其他的礼物。
返回在 k 秒后剩下的礼物数量。
示例 1:
123456789输入:gifts = [25,64,9,4,100], k = 4输出:29解释: 按下述方式取走礼物:- 在第一秒,选中最后一堆,剩下 10 个礼物。- 接着第二秒选中第二堆礼物,剩下 8 个礼物。- 然后选中第一堆礼物,剩下 5 个礼物。- 最后,再次选中最后一堆礼物,剩下 3 个礼物。最后剩下的礼物数量分别是 [5,8,9,4,3] ,所以,剩下礼物的总数量是 29 。
示例 2:
123456输入:gifts = [1,1,1,1], k = 4输出:4解释:在本例中,不管选中哪一堆礼物,都必须剩下 1 个礼物。 也就是说,你无法获取任一堆中的礼物。 所以,剩下礼物的总数量是 4 。
解答1234567891011121314151617class Solution {pu ...