📜  SDE 的 Media.Net 面试体验(校内)

📅  最后修改于: 2021-11-18 02:35:05             🧑  作者: Mango

Media.net 校园活动于 2020 年 12 月举行。

第 1 轮(90 分钟编码测试):有3 个问题。

  1. 生成给定后序和中序遍历的树。
  2. 数组操作
  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。