Directi面试问题
我今天参加了 Direct I 校园招聘的第一轮编码。分享被问到的2个问题。
问题1(最优子串反转):
给你一个字符串S。S 的每个字符要么是 'a',要么是 'b'。您希望恰好反转 S 的一个子字符串,以使新字符串在字典上小于您可以通过恰好反转一个子字符串获得的所有其他字符串。
例如,给定 'abab',您可以选择反转从索引 2 开始的子字符串 'ab'(从 0 开始)。这给了你字符串'abba'。但是,如果您从索引 1 开始选择反向子字符串“ba”,您将得到“aabb”。没有办法获得更小的字符串,因此在 [1, 2] 范围内反转子字符串是最佳的。
输入:
第一行包含一个数字 T,即测试用例的数量。
每个测试用例都包含一个字符串S。字符串的字符将来自集合 { a, b }。
输出:
对于每个测试用例,打印两个用逗号分隔的数字;例如“x,y”(不带引号且不带任何额外的空格)。 “x,y” 分别描述了子字符串的起始索引(从 0 开始)和结束索引,为了获得最小的字典字符串,必须反转子字符串。如果有多个可能的答案,请打印具有最小“x”的答案。如果仍然有多个答案,请打印具有最小“y”的答案。
约束:
1 ? ? 100
1 ? S 的长度? 1000
Sample Input:
5
abab
abba
bbaa
aaaa
babaabba
Sample Output:
1,2
1,3
0,3
0,0
0,4
注意力:
约束的设计使得每个测试用例的 O(N 3 ) 算法不会通过。
问题 2(数据库查询):2 分
你有一组 N 个对象。这些对象中的每一个都具有与其关联的某些属性。属性由(键,值)对表示。例如,假设您有以下两个对象。
Tower:
{
(height, 100), (weight, 50),
(xposition, 25), (yposition, 36)
}
Tree:
{
(area, 100), (noofleaves, 500),
(height, 25), (yposition, 36)
}
您拥有的每个对象最多有 4 个属性。一个对象至少有 1 个属性。请注意,从上面的两个对象中,所有对象的属性中的键不必相同。此外,密钥不必不同。
现在,给定 N 个这样的对象,您希望回答 M 个查询。每个查询由一组属性表示(同样,最多 4 个属性,至少 1 个属性)。查询的答案是集合中具有所有给定属性的对象的数量。如果键和值都匹配,则认为两个属性相等。
例如,如果您有上述两个对象,那么以下查询的答案是
查询: { (height, 100), (yposition, 36) }
答案: 1 // 匹配 Tower,但不匹配 Tree
查询: { (yposition, 36) }
答案: 2 // 同时匹配 Tower 和 Tree
查询: { (height, 100), (noofleaves, 500) }
答案: 0 // Tower 和 Tree 都不满足这两个属性
输入:
输入的第一行包含 N 和 M。接下来是对 N 个对象的描述。第 i 个对象的描述将以数字 k 开头,该数字是与该对象关联的属性的数量。接下来的 k 行包含两个空格分隔的字符串——属性键和属性值。请注意,属性值不一定是整数(尽管在上面的示例中是这样)。
接下来是 M 个查询的描述。查询的格式将与对象的格式完全相同。检查示例输入以进行澄清。
一个测试文件将只包含一个测试用例。一个测试用例可能包含多个查询。
输出:
打印 M 行。每行必须是相应查询的答案。
约束:
1 ? N ? 10000
1 ?米? 100000
1 ?克? 4
Sample Input
2 3
4
height 100a
weight 50b
xposition 25a
yposition 36b
4
area 100a
noofleaves 500
height 25
yposition 36b
3
weight 80
xposition 25a
yposition 36b
1
yposition 36b
2
xposition 25a
yposition 36b
Sample Output:
0
2
1