Media.net 校园活动于 2020 年 12 月举行。
第 1 轮(90 分钟编码测试):有3 个问题。
- 生成给定后序和中序遍历的树。
- 数组操作
- DP + 位掩码
4名学生入围面试。
第二轮(面试第一轮):
问题:给定两个长度相等的字符串A 和 B,其中的字符来自集合 {1,2}。如果您在第 i 个位置准确地向前或向后移动 S[i] 步并在最后一个位置结束,那么字符串S 是一个很好的字符串,这样您恰好覆盖了所有位置一次。给定两个好的字符串A 和 B,您必须告诉字符串相应位置之间可能交换的次数,以便字符串保持良好状态。
解释和答案:
A, B = length
{1, 2}
good strings:
1. covered all positions EXACTLY ONCE
2. ended at the last position
Example:
A = 2211
B = 1111
swap: {1, 2, 3}
A[1] B[1]
A[2] B[2]
A[3] B[3]
A' = 1111
B' = 2211
correct swapping.
How manny correct swappings
8
{}, {1, 2}, {1, 2, 3}, {1, 2, 4}, {1, 2, 3, 4}, {3}, {4}, {3, 4}
Answer:
bool validate(int num, char value, int& newNum) {
if(value == '1') {
newNum = 0;
return (num != 1);
}
if(value == '2'){
if(num == 1){
newNum = 2;
return true;
}
else if(num == 0){
newNum = 1;
return true;
}
else{
return false;
}
}
}
string A,B;
int n = A.size();
int dp[n][3][3];//initialised to 0
int solve(int s, int j, int k){
char a = A[s];
char b = B[s];
int nextj,nextk;
if(validate(j,a,nextj) && validate(k,b,nextk)){
dp[s][nextj][nextk] += dp[s-1][j][k];
}
if(validate(j,b,nextj) && validate(k,a,nextk)){
dp[s][nextj][nextk] += dp[s-1][j][k];
}
}
int main(){
//inputs
for(int i=0;i
第二次面试只选了1人。
第三轮(面试第二轮):
问题:您的磁盘上有一个 100 GB 的文件(数字)。您需要对文件进行排序,但您的系统只有 4 GB RAM。
可用参数
- 文件大小 – 100 GB,
- RAM 大小 – 4 GB,
- 页面大小 – 4 MB
- Read, Write – 从磁盘读取和写入(一次使用页面大小)。 Sort – 可用于对 RAM 中的数字进行排序
回答:
C
// FileSize = 100(in GB), ramSize = 4(in GB), pageSize =
// 4(in MB)
Void merge(int fileSize, int ramSize, int pageSize)
{
Int chunks = fileSize / ramSize;
Int chunksize = fileSize / chunks;
for (int i = 0; i < chunks; i++) {
Int curr = i * ramSize * 1024;
while (curr <= 4 * 1024) {
Read(curr);
Curr += pageSize;
}
Sort();
curr = i * ramSize * 1024;
Int pos = 0;
while (pos < ramSize * 1024) {
Write(pos, curr);
Curr += pageSize;
}
}
// now merge sorted chunks
Int cur = 0;
int* ptr = new int[chunks];
for (int i = 0; i < chunks; i++)
Ptr[i] = 0;
priority_queue(pair, vector >,
greater >) pq;
for (int i = 0; i < chunks; i++) {
Read(ptr[i]);
Ptr[i] += pageSize;
For(every element k in page)
{
pq.push_back(make_pair(k, i));
}
}
int* curr = new int[chunks];
for (int i = 0; i < chunks; i++)
curr[i] = 0;
Int k = 0;
// Output buffer
while (!pq.isEmpty()) {
pair p = pq.top();
pq.pop();
Int idx = p.second Output[k++]
= p.first curr[idx]++;
Int limit = pageSize / sizeof(int);
if (curr[idx] == limit) {
Curr[idx] = 0;
if (ptr[i] != chunkSize) {
Read(ptr[i]);
Ptr[i] += pageSize;
For(every element k in page)
{
pq.push_back(make_pair(k, idx));
}
Write(output to disk)
}
}
}
// Pop top element and store in output space
// If a page is emptied then bring next page
// from that chunk
// If ram is about to be filled then store the
// sorted file back to disk
}
最后,我收到了“Media.net”的offer。
谢谢,Geeksforgeeks。