📜  Flipkart 实习面试(校园内)

📅  最后修改于: 2021-11-17 09:58:05             🧑  作者: Mango

第 1 轮:编码测试,Hackerrank 平台,3 个问题,1.5 小时

1. 在给定的长度为 n 的数组中,找到 max(A[j] – A[i]) 使得 i < j。

2. 一个人可以用 3 朵玫瑰(花束成本 = p)或 1 朵玫瑰和 1 朵百合(成本 = q)制作一束花
在花的阵列中,该人必须选择连续的花组,即 2 或 3 组以获得最大成本。

输入格式:字符串0(代表玫瑰)和1(代表百合)。
输出:最大成本。

例子:

Input: p = 2, q = 3, s = 0001000
Output: 5

解决方案:动态规划

if three consecutive 0's:
              dp[i] = max(dp[i-1], p + dp[i-3])
          else if 1, 0 or 0, 1:
              dp[i] = max(dp[i-1], q + dp[i-2])
          
          return dp[n-1]

注意:处理边界值以避免数组索引越界错误。

3. 给出了一个图,其中节点代表孩子,加权边连接两个有共同爱好的孩子。
示例:如果两个节点“i”和“j”由值为“k”的边连接,则意味着“i”和“j”都有共同的兴趣点“k”。
找出’i’、’j’的最大乘积,其中’i’、’j’是共享共同爱好的最大数目的孩子。

解决方案:创建一个哈希表,存储一对“i”、“j”之间的边数。如果 ‘i’ 和 ‘j’ 之间的边数最大,则求它们的最大乘积。

解决所有三个问题的人将被选入下一轮(27 名学生)。

第一轮:技术
1. 在给定的树中,找到最大可能的总和,这样如果选择了一个节点,则无法选择它的子节点,即如果将节点的值添加到总和中,则总和中不能出现它的子节点。我被要求在 5 分钟内编写伪代码(计时器正在运行)。
解决方案:树上的动态规划

2. 在给定的数组中,找到最长的子数组,使得相邻元素相差 1。
3. 在给定的数组中,找到最长的子序列,使得相邻元素相差 1。

解决方案:最长子序列,使得相邻元素相差 1

4. 给定一个函数f,使得 f(x) = y 且 1 <= y <= x,创建给定字符串的随机排列。它应该每次都创建随机排列。
解决方案:交换 str[ni] 和 str[f(ni)],其中 i 从 1 变化到 n。

第二轮:技术
1. 用给定的字符串集创建一个链,使得在相邻字符串,第一个字符串的最后一个字母 = 第二个字符串的第一个字母。
示例

Input: tap cat pac
Output: tap -> pac -> cat

众所周知,它将形成一个循环,即链的第一个字符串的第一个字母=链的最后一个字符串的最后一个字母。

解决方案:链式字符串数组形成一个圆圈

我给出了一个使用一个哈希表和一个数组的解决方案,这基本上是一个DFS遍历。面试官没见过这种做法,给了很多测试用例,通过了。

2. 给定 n 个玩家和他们持有的比赛结果,创建一个字符串,如果 A 击败 B 并且 B 击败 C,那么他们应该被放置为 ABC。 C有可能打败了A。

类似于上一个问题。他想要涉及有向图和回溯的解决方案,所以他问了这个问题。

3. 拼图:玩家 1 和玩家 2 轮流将硬币放在圆盘上。最后一个能够在圆盘上放置硬币的人获胜。设计一个策略,使得玩家 1(第一个放置硬币的人)总是获胜。

解决方案:圆桌投币游戏

4. 给定一棵二叉树,打印它的左视图。写出伪代码。
示例

Input:
         1
           / \
          2   6
                 / \
                7   0
               /\   /
              3  9 2
Output: 1 2 7 3

解决方案:二叉树的左视图