📜  Directi面试|一组7(编程问题)

📅  最后修改于: 2021-04-23 19:33:16             🧑  作者: Mango

一篇包含最近Directi编程回合问题的文章,这些问题在我的校园布置以及我朋友的大学中都存在。

1)给您一个字符串S。S的每个字符都是’a’或’b’。要扭转S的正好一个子字符串,新字符串是字典顺序比所有其他的字符串小,你可以通过反转正好一个子串得到。
例如,给定“ abab”,您可以选择反转从索引2(基于0)开始的子字符串“ ab”。这将为您提供字符串“ abba”。但是,如果从索引1开始选择相反的子字符串“ ba”,则会得到“ aabb”。无法获得较小的字符串,因此反转[1,2]范围内的子字符串是最佳选择。

输入
第一行包含一个数字T,即测试用例的数量。
每个测试用例包含单个字符串的字符串S的字符将是从集合{A,B}。

输出
对于每个测试用例,请打印两个数字,并用逗号分隔;例如“ x,y”(不带引号,也没有任何其他空格)。 “ x,y”分别描述子字符串的开始索引(基于0的索引)和结束索引,为了获得最小的字典字符串,必须反转该索引。如果有多个可能的答案,请用最小的“ x”打印。如果仍然有多个答案,请用最小的“ y”打印。
约束条件
1 <= T <= 100
1 <= S的长度<= 1000
样本输入
5
阿巴布
阿巴
bbaa
a
巴巴阿巴
样本输出
1,2
1,3
0,3
0,0
0,4

2)给定两个字符串I和F,其中I是初始状态,F是最终状态。每个状态将包含“ a”,“ b”以及仅一个由“ _”表示的空插槽。您的任务是以最少的操作次数从初始状态转换为最终状态。
允许的操作是
1.您可以将空字符与任何相邻字符交换。 (例如,可以将“ aba_ab”转换为“ ab_aab”或“ abaa_b”)。
2.您可以交换与旁边相邻的字符空字符只有当相邻的字符是从旁边相邻的字符不同。 (例如,可以将“ aba_ab”转换为“ a_abab”或“ ababa_”,但不能将“ ab_aab”转换为“ abaa_b”,因为“ a”不能跳过“ a”)。
输入
第一行包含单个整数T –测试用例的数量(小于25)。随后是T检验案例。
每个测试用例在不同的两行中包含两个字符串I和F,其中I是初始状态,F是最终状态。 I和F可能相等。它们的长度将始终相等。它们的长度至少应为2。长度不能超过20。

输出
对于每个测试用例,输出一行包含从初始状态到最终状态所需的最少步骤数。您可以假设总是有可能从初始状态到达最终状态。您可以假设答案不超过30。
例子
输入:
2个
a_b
ab_
aba_a
_baaa

输出:
1个
2个

3)根据以下伪代码为二叉搜索树生成概率预序遍历

function preorder(u) {
    if u is null then return
    print u.label
    r = either 0 or 1 with 50% probability
    if r == 0
        preorder(u.left_child)
        preorder(u.right_child)
    if r == 1
        preorder(u.right_child)
        preorder(u.left_child)
}

给定二叉搜索树的遍历遍历,您始终可以唯一地构造二叉搜索树。由于二叉搜索树的有序遍历当然是标签的排序列表。
给定某个二分搜索树的概率先验遍历之一,请打印上述算法可能生成的不同概率先验遍历的数量。为清楚起见,请参见说明部分。

输入
输入的第一行等于N,即测试用例的数量。接下来是对N个测试用例的描述。每个测试用例的第一行是整数N,即二进制搜索树中的节点数。在下一行中,有N个整数-二进制搜索树的概率序遍历。测试用例中节点的所有标签将是不同的。测试用例中每个标签的值将在1到N之间(含1和N)。您可以假设输入将是某个二分搜索树的有效概率预遍历。

输出

对于每个测试用例,单独在一行上打印一个数字。此数字应该是二进制搜索tee存在的不同概率序遍历的数量-包括测试用例中给出的遍历次数。您可以假设答案将始终小于或等于1,000,000,000。实际上,很容易看出答案永远不会超过2 ^ 30(读幂)。
约束条件
1 1 <= N <= 30

样本输入
3
3
2 1 3
3
1 2 3
5
2 4 3 5 1

样本输出
2个
1个
4

4)您将获得一个由10,000,000位组成的大型数组。最初,每个位为0。您执行几种类型的操作:“将所有位在start_index和end_index之间翻转,包括端点在内”。给定一系列此类操作的顺序,请对阵列执行所有操作。最后,将数组分成4位的集合–前四个,下四个,然后下四个,依此类推。每个集合可以代表一个十六进制整数。恰好有2,500,000个十六进制整数。计算2,500,000个整数中从“ 0”到“ f”的每个十六进制整数的频率,然后打印出来。为了清楚起见,请参见输入/输出和样本输入/输出的说明。
输入
输入的第一行包含一个整数T(1?T?10),即测试用例的数量。然后是对T测试用例的描述。您应该假设该数组恰好具有10,000,000位,并且在每个测试用例开始时都未设置这些位。每个测试用例的第一行包含一个整数N(1?N?10,000),即执行的操作数。接下来的N行包含两个整数,每个整数之间用空格隔开,分别是各个操作的start_index和end_index。请注意,翻转操作是从start_index到end_index(包括两端)执行的。另外,该数组是1索引的-意思是,最小的索引是1,最大的索引是10,000,000。
输出
对于每一个测试的情况下,输出端16点的整数在一行上,分离通过单个空格字符。第一个整数应表示根据问题声明创建的2,500,000个十六进制整数中出现0的次数。第二个整数应表示根据问题语句创建的2,500,000个十六进制整数中1出现的次数,依此类推。
约束条件
1 <=起始索引<=终止索引
start_index <= end_index <= 10,000,000
样本输入
2个
2个
1 4
9999997 10000000
2个
3 6
5 8

样本输出
2499998 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
2499998 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0

5)给您两个长度相同的字符串,例如A和B,例如N。您可以将A [i]和B [i]交换为介于1和N之间(包括两个端点)的所有i。你可以不换内的或同样在B.两个字符,你只能在与字符B中的相同指数互换字符,并没有其他字符。您可以执行此操作零次或多次。
要修改通过操作字符串以这样的方式,独特的字符字符串中的数量很小。实际上,如果n(A)是A中唯一字符的数量,而n(B)是B中唯一字符的数量;您希望执行使max(n(A),n(B))尽可能小的操作。
完成所有操作后,打印max(n(A),n(B))的值。

输入
输入的第一行包含T,即测试用例的数量。然后是对T测试用例的描述。每个测试用例的第一行都包含数字N。测试用例的下两行包含两个N个字母字符串,分别为A和B。这些字母是小写的英文字母。
输出
为每个测试用例打印一行。在执行所有操作后打印max(n(A),n(B))的值,以使该值尽可能小。
约束条件
1 <= T <= 100
1 <=长度(A)<= 16
长度(B)=长度(A)

样本输入
3
7
指挥
Itcerid
5
阿巴巴
babbab
5
阿巴阿
巴巴

样本输出
4
1个
2个

6)让我们定义一个字符串作为开始标签,其中x是拉丁字母的任何小写字母。
每个开始标签都与该类型的结束标签匹配,其中x是相同的字母。
标签可以彼此嵌套,即一个打开和关闭标签对可以位于另一对内部。

让我们定义一个XML文本的概念:

1)空字符串是XML文本
2)如果S是XML文本,则“ S”(为清楚起见,用引号和空格表示)也是XML文本,
其中a是任何小的拉丁字母
3)如果S1,S2是XML文本,则“ S1 S2”(引号和空格是为了清楚起见)也是XML文本

您将得到一个字符串。您必须验证给定的字符串是否为有效的xml。
输入
第一行包含T个测试用例
对于每个测试用例:
只有一行包含xml标记的字符串S。
输出
如果s是有效的xml FALSE,则在一行中打印一个字符串TRUE,否则为FALSE。
约束条件
0 0 例子
输入:
2个

输出:
真的
错误的

7)在这个问题中,我们考虑两个相互平行的楼梯A和B。两个楼梯A和B都有N个台阶,其中A [i],B [i]分别代表A和B的第i个台阶。
每个步骤都有一定量的罚款,如果您使用该步骤,您将受到相同金额的罚款。采取一些步骤后,您将累积对您访问过的所有步骤的惩罚。
您的最大跳跃长度为K,即,从A [i]您可以向前跳跃到A [i + 1]或A [i + 2]…或A [i + K],而无需使用任何中间步骤。
您也可以跳过楼梯,并因更改楼梯而受到额外的罚款P。例如,您可以从A [i]跳到B [i + 1]或B [i + 2]…或B [i + K],并加上额外的惩罚P和您所走步的惩罚。您也可以从楼梯B跳到楼梯A,这也会招致额外的罚款P以及您所走台阶的罚款。
请注意,从每个步骤开始,您都只能向前跳。最后的罚款将是您所走过的所有台阶的罚款加P乘过楼梯的次数。
您可以从A [1]或B [1]开始,并且应该达到A [N]或B [N],以最大程度地减少沿途累积的罚款。找到您将累积的最低罚款。
输入
输入的第一行等于T,即测试用例的数量。然后是对T测试用例的描述。每个测试用例的第一行都有三个整数N,两个楼梯的步数K,最大跳跃长度P,穿越楼梯的惩罚。在每个测试用例的第二行,有N个整数,其中第i个整数表示步骤A [i]的代价。在每个测试的第三行,有N个整数,其中第i个整数表示步骤B [i]的惩罚。
输出
对于每个测试用例,输出一行,其中包含可以从{A [1]或B [1]}到{A [N]或B [N]}结束的路径上可以累积的最小代价。
约束条件
1 <= T <= 10

1 <= N <= 1000

0 <= P <= 1000

1 <= K <= N

0 <= A [i],B [i] <= 1000
例子
输入:
6
4 1 0
1 2 3 4
1 2 3 4
4 1 0
1 2 3 4
4 3 2 1
4 2 0
1 2 3 4
4 3 2 1
4 1 10
1 2 3 4
4 3 2 1
4 2 10
1 2 3 4
4 3 2 1
5 1 50
0 0 102 104 0
101103 0 0 105

输出:
10
6
4
10
7
100

8)在这个问题中,我们考虑了具有根r的根树Tr(不一定是二叉树)。从根r开始对树Tr进行dfs(深度优先搜索)遍历,以特定顺序访问Tr的节点。让我们将该命令称为dfs排序。
请注意,在遍历dfs期间,我们可以从每个节点中选择首先要遍历的子级。
这些不同的选择导致不同的dfs顺序。您必须找到dfs访问节点的不同方式,即Tr上dfs从根r开始可能会出现的节点的不同顺序数。

考虑一个示例Tr,其中3个节点标记为1,2,3,其中1为根,2和3为1的子节点。

此Tr上的dfs可以按(1、2、3)或(1、3、2)的顺序访问节点。因此,有2种dfs排序方式。

请参阅样本测试用例以获取更多示例
输入
输入的第一行等于T,即测试用例的数量。然后是对T测试用例的描述。每个测试用例的第一行是整数N,即树Tr中的节点数。每个节点都标有介于1和N之间(含1和N)的不同整数。在下一行,有N个整数,其中第一个整数表示根树Tr中标记为i的节点的父标记。测试用例中每个标签的值将在1到N之间(含1和N)。标为i的节点的父节点的标签小于i。带有标签1的节点是根节点r。在测试案例中,根节点的父节点将被指定为0。
输出
对于每个测试用例,输出单行,其中包含Tree Tr上dfs可能具有的不同顺序数。由于此数字可能很大,因此输出值取模1,000,000,007。

约束条件
1 <= T <= 100
1 <= N <= 1000
0 <= A [i]

例子

输入
6
2个
0 1
3
0 1 1
4
0 1 1 1
3
0 1 2
4
0 1 1 2
5
0 1 1 2 2

输出
1个
2个
6
1个
2个
4

9)卡特里娜飓风是一个超级怪胎。她喜欢优化事物。假设她在包含“ m”行和“ n”列的二维网格的位置(0,0)。她希望到达该网格的右下角,并尽可能通过最少的单元格。
网格中的每个单元格都包含一个正整数,该正整数定义了Katrina到达该单元格时可以向右或向下跳跃的单元格数量。她不能向左或向上移动。
您需要找到卡特里娜飓风的最佳路径,以便以最小跳数从网格的左上角位置开始到达右下角位置。
输入
提供了一个模板,您必须在其中实现一个函数minHops。 minHops的声明看起来像

C / C++
int minHops(int matrix [64] [64],int m,int n)

Java
statuc int minHops(int [] []矩阵,int m,int n)

输出
该函数应返回从网格的左上角到右下角(包括同时触摸左上和右下单元)应触摸的最小单元数。如果没有路径,则返回0。
例子
假设网格看起来像这样

2 4 2
5 3 8
1 1 1

从A(0,0)开始包含’2’,因此您可以转到(0,2)或(2,0)。
因此存在以下两条路径从(0,0)到达(2,2)
(0,0)=>(0,2)=>(2,2)
(0,0)=>(2,0)=>(2,1)=>(2,2)

因此,此测试用例的输出应为3

例子2

5 3 8 2
6 4 2 1

没有从(0,0)到(1,3)的路径,因此这种情况下的输出应为0

例子3

2 3 2 1 4
3 2 5 8 2
1 1 2 2 1

在这种情况下,各种路径是
(0,0)=>(0,2)=>(2,2)=>(2,4)
(0,0)=>(2,0)=>(2,1)=>(2,2)=>(2,4)

因此,在这种情况下,输出应为4

10)考虑具有网格状房屋结构的纽约市。将以矩阵形式为您提供城市地图。每个单元代表一栋建筑物。您可以从每个建筑物的四个方向前往相邻的四个建筑物:东,西,北,南。蜘蛛侠想营救一幢建筑物上的受害者。将为您提供受害者的位置,蜘蛛侠位于(1,1)建筑物中。但是,有一个条件是,如果蜘蛛蜘蛛的高度差大于某个特定值,它们将无法在建筑物之间跳动。寻找蜘蛛侠穿越最少建筑物的方式来到达受害者的方法。

输入
输入包含多个测试用例。第一行是整数T,代表要遵循的测试用例数。

每个测试用例的第一行都有4个数字-M,N,X,Y,D。此处MxN是城市网格的尺寸。 (X,Y)是受害者的位置。

随后是M行。每条线由N个以空格分隔的正整数组成,该整数与建筑物高度相对应。 D是蜘蛛侠可以穿越的建筑物之间的最大高度差。
输出
每个测试用例只有一行包含一个整数,表示蜘蛛侠需要穿越的最少建筑物数量。如果不可能,则返回-1。
约束条件
应该包含对您可能具有的输入数据的所有约束。像这样格式化:
1 <= T,M,N,X,Y <= 100
1 <= D <= 100000
每栋建筑的高度将小于100000

例子
输入:
3
3 3 3 3 2
1 2 3
6 9 4
7 8 5
3 3 3 3 1
1 8 3
9 5 6
7 2 4
3 3 3 3 1
1 6 7
2 5 8
3 4 9

输出:
3
-1
7

11)您将得到一个由N个节点组成的树。每个节点的编号从0到N-1,每个节点i与值vi关联。
假设树的根节点为0。
如果x在从节点0到节点y的路径中出现,则将节点y称为节点x的后代。根于节点x的子树被定义为是x(包括x)的后代的所有节点的集合。
如果子树中所有节点的值都相等,则将其称为单值。
给定树和与树中节点关联的值,您需要找到树中单值子树的数量。
输入
第一行包含一个整数N,它是树中节点的数量。接下来的N行包含代表与每个节点关联的值的N个整数,即,第i行包含与节点i-1关联的值。接下来的N-1行给出了树中边缘的信息。每行包含两个以空格分隔的整数x和y,表示节点x和y之间的边。
输出
您必须打印给定树中包含的单值子树的数量。
约束条件
N <= 30000
例子
输入:
5
0
0
1个
1个
1个
0 1
0 2
2 3
2 4
输出:
4

12) Directi每隔一段时间组织一次FNCS(星期五晚上寒意课程)(很多乐趣!)。导演会来参加各种活动,然后在感到疲倦时外出,并在精神焕发时再次回来。为了方便起见,记录了任何人的进出情况。最终,组织者想知道活动期间的最大人数。因此,他请求您的帮助。他给您每个人的出入时间,如下所示:

Person   Entry_time Exit_time
#1       6          10
#2       1          7
#3       1          4  
#4       8          10
#5       6          10

该人的身份无关紧要。 #1和#4可能是同一个人。在这种情况下,活动期间任何时候最多可容纳3人。
您的任务是读取条目并计算事件过程中出现的最大人数。
输入
输入包含多个测试用例。第一行是整数T,代表要遵循的测试用例数。每个测试用例的第一行是数字N,即出入境记录数。接下来是N行。每行由两个空格分隔的整数组成,分别对应一个人的进入时间和离开时间。
输出
每个测试用例一行包含一个整数,表示任何时候在聚会上出现的最大人数。
约束条件
1 <= T <= 100
1 <= N <= 100
1 <= ENTRY_TIME 保证人员出入的时间是截然不同的

例子
输入
1个
6
7 8
4 9
6 9
8 17
2 14
2 10

输出
5

Directi的所有练习题!

相关实践问题

最大间隔重叠