领英面试经历 | 6
在hackerrank在线平台上提出了四个问题,他们是
1. Anna 有一个由 n 个整数组成的数组 num。她可以通过移动将数组减少 1 个元素。每一步都包括以下三个步骤:
选择两个元素 numi 和 numj,这样 i ? j.
从数组中删除两个选定元素(numi 和 numj)。
将已删除元素的总和 (numi + numj) 添加为数组末尾的新元素。
每个移动都有一个与之相关的成本,这个成本等于移动期间从数组中删除的两个元素的总和。将数组减少 n?1 个元素(即,减少到单个元素)的成本是所有 n?1 个移动的成本之和。例如,考虑数组 num = [1, 2, 3]。 Anna 在第一步中移除 1 和 3,代价为 1 + 3 = 4,结果数组为 num1 = [2, 4]。然后,她在第二步中移除 2 和 4,代价为 2 + 4 = 6,结果数组为 num2 = [6]。使用这一系列移动将这个数组减少到一个元素的总成本是 4 + 6 = 10。
在您的编辑器中完成 reductionCost函数。它有 1 个参数:一个由 n 个整数组成的数组,num。它必须返回一个整数,表示将数组减少为单个元素的最小成本。
解决方案 - 使用 minheap 轻松完成,C++ 中的优先级队列
2. 分隔偶数和奇数
3. 一个社交网络有 n 个活跃用户,编号从 0 到 n-1,他们有选择地与其他用户交朋友,以在网络内创建朋友组。我们定义以下内容:
如果两个用户 x 和 y 在网络上彼此成为朋友,则他们是直接朋友。
如果存在某个用户 x 和 z 共有的直接朋友 y,则两个用户 x 和 z 是间接朋友。
如果两个用户 x 和 y 彼此是朋友(直接或间接),则他们属于同一组。
换句话说,如果用户 x 是一个组的一部分,那么用户 x 的所有朋友和朋友的朋友都属于同一个组。
我们将每个组中的人数描述为一个由 n 个整数组成的数组 counts,其中每个 countsi (0 ? i < n) 表示用户 i 所属组中的用户总数。例如,如果counts = [3, 3, 3, 3, 3, 1, 3],那么有三个组;用户 0、1、2、3、4 和 6 属于两个 3 人组之一,用户 5 属于 1 人组。
ID 0 1 2 3 4 5 6
Group Size 3 3 3 3 3 1 3
如果组中的所有用户都具有最少的 ID 号,则该组是有效的。换句话说,一个大小为 k 的组必须包含属于该组中的最小用户 ID 的 k 个最小 ID 号。例如,如果 counts = [3, 3, 3, 3, 3, 1, 3],则分组 [0, 1, 2], [3, 4, 6] 和 [5] 有效;但是,分组 [0, 1, 4]、[2, 3, 6] 和 [5] 无效,因为组 [0, 1, 4] 不包含用户集的三个最小用户 ID属于 3 人组的 ID(即 {0, 1, 2, 3, 4, 6})。
4. 只有当通过对一个或两个字符串执行一定数量的操作可以使它们相等时,才说两个字符串a 和 b 是双胞胎。有两种可能的操作:
SwapEven:将偶数索引处的字符与另一个偶数索引处的字符交换。
SwapOdd:将奇数索引处的字符与另一个奇数索引处的字符交换。
例如,a = “abcd” 和 b = “cdab” 是双胞胎,因为我们可以通过执行操作使它们等价。或者,a = “abcd” 和 b = “bcda” 不是双胞胎(操作不会在奇数和偶数索引之间移动字符),a = “abc” 和 b = “ab” 也不是(不会插入任何操作将“c”转换为字符串b)。