📜  直飞面试经历 |设置 15(校内)

📅  最后修改于: 2022-05-13 01:58:40.107000             🧑  作者: Mango

直飞面试经历 |设置 15(校内)

第 1 轮:Codechef 在线测试包含 3 个编码问题

1. Amanada,一个小学生,正在学习英文字母。她的老师设计了一个小游戏来让这项任务变得有趣。 'm' 行和 'n' 列的网格充满英文字母。她需要通过在任何相邻网格单元格中一次移动一个步骤来搜索此网格中的英文单词。字母网格和一组给出了英文单词。 Amanda 可以从网格中的任何位置开始,并且可以在 8 个相邻网格单元中的任何一个中移动,一次一步。每个网格单元只能使用一次。
输入
您将获得一个模板,您需要在该模板中实现其签名如下所示的函数。
C
int findWordInAGrid(char grid[128][128], int m, int n, char word[32])
/* 返回 0 为假,1 为真。 */

C++
bool findWordInAGrid(char grid[128][128], int m, int n, char word[32])

Java
static boolean findWordInAGridJava(char[][] grid, int m, int n, String word)

grid[][] 表示给定网格中的字符。只有前 m 行和前 n 列应该被认为是相关的。 word 是必须在网格中找到其出现的单词。请记住,单词可以从网格中的任何位置开始。 word 永远不会包含超过 30 个字符。如果在网格中找到单词,则返回 true,否则返回 false。
输出
如果您可以在网格中找到该单词,则该函数应返回 true,否则返回 false。
例子
让我们考虑下面给出的网格:
美国广播公司
定义

要搜索的单词集是:
美国广播公司
阿贝迪
efgh
输出:
上述示例的输出应为:
abc:是的
abedhi: 真的
efgh:假的

2.给你一个 3 行 N 列的网格。网格中的每个单元格最初都包含值 0。您在网格上执行以下类型的几个操作 选择一行,比如 r。选择一个开始列和结束列,比如 s 和 e。当然 1 ≤s ≤ e ≤ N。现在,将 r 行网格中从 s 列到 e 列的所有值设置为 1。执行所有操作后,您希望在此网格中找到子网格(或矩形,如果你愿意)其中只包含 1s。最重要的是,您希望找到面积最大的矩形。打印这个矩形的面积。
输入
输入的第一行包含一个数字 T,即测试用例的数量。每个测试用例的第一行分别包含数字 N 和 M,用一个空格分隔。 N 是网格中的列数。 M 是您在网格上执行的操作数。接下来的 M 行中的每一行分别包含三个整数 R、C1 和 C2 来描述操作。 R 是执行操作的行。 C1 和 C2 分别是开始列和结束列。您可以假设 1 ≤ C1 ≤ C2 ≤ N。
输出
对于每个测试用例,单独在一行上输出一个数字。这个数字应该是可以在网格上选择的最大矩形的面积——它只包含 1。
约束
1≤T≤100
1≤N≤1000000
1≤M≤1000
注意:测试数据的设计使得在 O(N) 中模拟每个操作的解决方案将获得 TLE。您应该能够在 O(N) 中解决每个测试用例。提示:将每个操作转换为一对“开始”和“结束”事件。请注意,操作顺序无关紧要。因此,您可以按列的递增顺序处理事件。您还可以简单地存储每个单元格开始/结束的事件数量(因为所有事件都是相似的并且具有幂等性)。现在,您可以逐列遍历网格,在每行的左侧保持最长的 1 连胜。这有助于考虑在当前列具有右边缘的最佳矩形。
样本输入
3
5 2
1 1 4
2 3 5
10 3
1 1 8
2 2 10
3 1 9
5 2
2 1 4
3 3 5
样本输出
4
21
4
解释
在第一个测试用例中,最终网格看起来像
11110
00111
00000
我们可以看到最大的长方形面积为 4。这样的长方形有两个。 1,1 –
1,4。和 1,3 – 2,4。
在第二个测试用例中,最终网格看起来像
1111111100
0111111111
1111111110
最大的矩形是 1,2 – 3,8。这个矩形的面积是 3*7=21。

3.给你 N 颗石头,从 1 到 N 标记。第 i 颗石头的重量为 W[i]。有 M 种颜色,用从 1 到 M 的整数标记。第 i 块石头的颜色为 C[i](当然,是 1 到 M 之间的整数,包括 1 到 M)。你想用这些石头装满一个背包。背包可以装 X 的总重量。每种颜色之一。石头的重量总和不得超过 X。由于您为容量为 X 的背包(相对于容量较小的背包)支付了溢价,因此您希望尽可能多地装满背包。
编写一个程序,将上述所有值作为输入,并计算填充背包的最佳方式——即最小化未使用容量的方式。输出这个未使用的容量。为了清楚起见,请参阅示例测试用例的说明。
输入
输入的第一行包含整数 T,即测试用例的数量。然后是T测试用例的描述。每个测试用例的第一行包含三个整数,N、M 和 X,由单个空格分隔。下一行包含 N 个整数,W[1], W[2], W[3] ... W[N],由单个空格分隔。下一行包含 N 个整数 C[1]、C[2]、C[3] ... C[N],由单个空格分隔。
输出
填充背包的最佳方式可最大限度地减少未使用的容量。可能有几种填充背包的最佳方式。以最佳方式输出背包的未使用容量(一行上的单个整数)。如果没有办法填满背包,则输出-1。输出 T 行,每个测试用例一个。
约束
1≤T≤10
1≤M≤100
M≤N≤100
1≤W[i]≤100
1≤C[i]≤M
1 ≤ X ≤ 10000
样本输入
4
9 3 10
2 3 4 2 3 4 2 3 4
1 1 1 2 2 2 3 3 3
9 3 10
1 3 5 1 3 5 1 3 5
1 1 1 2 2 2 3 3 3
3 3 10
3 4 4
1 2 3
3 3 10
3 3 3
1 2 1
样本输出
0
1
-1
-1
解释
在第一个测试用例中,您可以选择石头 2、石头 5 和石头 9。背包将完全装满。当然,还有其他几种选择石头的方法可以使背包装满。所有这些方式中未使用的容量都是 0。
在第二个测试用例中,您不能选择使背包完全装满的石头。您可以选择石头{1, 4, 9},使得未使用的容量为10-1-1-5 = 3。但是还有更好的方法。选择石头 {2, 5, 8}。未使用的容量为 10-3-3-3 = 1。这是最佳方式。还有另一种最佳方式。选择石头 {1, 5, 9}。未使用的容量为 10-1-3-5 = 1。在第三个测试用例中,只有一个选项。选石{1, 2, 3}。总重量为 11。这超出了背包所能容纳的重量。在第四个测试案例中,没有颜色为 3 的宝石。因此,不可能选择有效的宝石。
答案将是-1。
解决一个问题的人被选中进入第二轮。
第 2 轮:(Skype 采访 - 45 分钟)

1.给定一个 m*n 的网格,玩家 P1 和 P2 分别位于节点 (x1,y1) 和 (x2,y2)。有 n 颗宝石放置在网格的不同位置,即 (G1,G2,G3…..Gn)。计算挑选所有宝石所需的最低成本。宝石可以由单个玩家拾取。应按特定顺序采摘宝石,即应先采摘 G1,然后采摘 G2,然后采摘 G3,依此类推。
例如:
P1 (1,1) & P2(3,4)
有4个宝石:
G1 (1,1), G2(2,2),G3(3,2),G4(4,2)
总成本:5
P1 将选择 G4。
P2 将选择 G1、G2、G3。
复杂度:O(n)
第 3 轮:(Skype 采访 - 45 分钟)
1. 给定一个包含 n 个元素的数组。需要对数组执行“n”个操作。对于每个操作 start_index、end_index、trim_value 给出。一个已经修剪了从 start_index 到 end_index 的值。如果该索引处的值大于或等于修剪值,则使其等于修剪值,否则保持原样。执行“n”次操作后,找到数组的最大值。
复杂度: O(n)

Directi的所有练习题!