微软18预科生笔试题

1. 击鼓传花。有N个人标号为0~N-1,每次击鼓传递人数为t。花从第0个人开始传,到t停止时,该人淘汰,花交给下一个人。持续直到只剩最后一人。设计函数求胜利者。
输入: people,整数
            sec,整数
输出: winner,整数

实例: people: 3
            sec: 2
            输出: 1,人的标号为[0,1,2],第一次传两个人,花到2手里,2淘汰,花交给0;第二次传两人,花回到0手里,0淘汰,花交给1;仅剩一人,1胜出

2.一个长度为N的数列,数据大小随机。从0位置开始寻找右边比左边大的数,如果满足就进行标记,一次寻找结束后,将标记的数据移除。直到没有需要标记的数据。设计函数求需要寻找的次数
输入: numOfTrue,整数
            highList,N*1数组
输出: days,整数

实例: numOfTrue: 4
            highList: [3,7,9,8]
            输出: 2,第一次移除7,9.第二次移除8

3. 一个长度为N的数列,数据大小随机。如果某个位置的后面的数值比这个位置的数值小,则记录这两个位置的差值为anonymous。找出整个数列的最大的anonymous。
输入: numOfPeople,整数
            weightList,N*1数组

输出: maxAnonymous,整数
实例: numOfPeople: 4

            weightList: [5,7,4,8]
            输出: 2,因为5比4大,anonymous为2;7比4大,anonymous为1;最大的anonymous为2

4.小明在实习,每天可以选择一个eazy的工作,或者一个hard的工作。但是当且仅当前一天没有工作时,才能在当天选择hard 的工作。不同的工作对应的salary不同。
给出在实习的天数和这些天里所有工作对应的salary组合。求出小明能拿到的最大salary

输入: numOfDays,整数
            salaryList,N*2的二维数组
输出: maxSalary,整数

实例: numOfDays: 4
            salaryList: [[1,5],[2,3],[2,9],[1,3]]
            输出: 5+0+9+1=15

全部评论
1.经典约瑟夫环问题 2.没看懂到底是删哪个,不过大致意思懂了(我理解是删右边的数),链表处理然后每遍跑的时候如果产生了单调递减的序列就加一个其头指向尾的标记。(我算不出复杂度,应该不会退化到n方吧) 3.预处理一个前i最大和后i最小然后二分答案(或者对每个位置都二分出后置比它小的最大位置)不知道有没有O(n)算法 4.dp,f[i,0] f[i,1] f[i,2]表示第i天不工作、hard、easy的总最大薪资,可从i-1转移过来
点赞 回复
分享
发布于 2018-04-03 16:32
第四题还有一个条件,每天difficult的薪水比Easy的高
点赞 回复
分享
发布于 2018-04-03 15:39
小红书
校招火热招聘中
官网直投
前三个题纯模拟或者暴力都能过, 感觉微软的测试用例有点水。。
点赞 回复
分享
发布于 2018-04-03 16:14
就过了前两题100%,后面的为0,是不是凉了。。
点赞 回复
分享
发布于 2018-04-03 22:44
不是不能泄露题目嘛、、
点赞 回复
分享
发布于 2018-04-03 23:52
要是有数据规模就好了
点赞 回复
分享
发布于 2018-04-04 11:05
你收到微软的通知了吗?
点赞 回复
分享
发布于 2018-04-05 07:05
这已经是第三套题了吧 (ÒωÓױ)!!!
点赞 回复
分享
发布于 2018-04-05 08:40
int max_salary(int **List, int len) {  int result_1 = 0, result_2 = 0, result = 0;  if (len <= 0)   return result;  result_1 = max_salary(List, len - 1) + *(*(List + len - 1) + 0);  result_2 = max_salary(List, len - 2) + 0 + *(*(List + len - 1) + 1);  if (result_1 >= result_2) {   result = result_1;  }  else {   result = result_2;  } } int main() { #define MAXNUMLENGTH 5 #define MAXLENGTH 100  char input_num[5] = { 0 };  char input[MAXLENGTH] = { 0 };  int in_count = 0;  int count = 0;  int num_len = 0;  int len = 0;  int num_of_days = 0;  //输入第一行  char c = getchar();  while (c != '\n') {   input_num[count] = c;   c = getchar();   count++;  }  num_len = count;  count = 0;  for (int i = num_len - 1; i >= 0; i--) {   num_of_days += (int)((input_num[i] - '0')*pow(10, in_count));   in_count++;  }  in_count = 0;  //输入第二行  c = getchar();  while (c != '\n') {   input[count] = c;   c = getchar();   count++;  }  len = count;  count = 0;    //申请内存  int **salary_list = (int **)(malloc(sizeof(int*) * num_of_days));  for (int i = 0; i < num_of_days; i++) {   *(salary_list + i) = (int*)(malloc(sizeof(int) * 2));   memset(*(salary_list + i), 0, 2);  }  int first_num = 0, second_num = 0;  for (int i = num_of_days - 1; i >= 0; i--) {   count += 2;   second_num = 0;   while (input[len - count - 1] != ',') {    second_num += (int)((input[len - count - 1] - '0')*pow(10, in_count));    in_count++;    count++;   }   in_count = 0;   count++;   *(*(salary_list + i) + 1) = second_num;      first_num = 0;   while (input[len - count - 1] != '[') {    first_num += (int)((input[len - count - 1] - '0')*pow(10, in_count));    in_count++;    count++;   }   in_count = 0;   count++;   *(*(salary_list + i) + 0) = first_num;  }  /*  for (int i = 0; i < num_of_days; i++) {   for (int j = 0; j < 2; j++) {    cout << *(*(salary_list + i) + j) << endl;   }  }  */  //int salary_list[4][2] = { {1, 5},{2, 3},{2, 9},{1, 3} };  cout << max_salary(salary_list, num_of_days) << endl;  //释放内存  for (int i = 0; i < num_of_days; i++) {   free(*(salary_list + i));   *(salary_list + i) = NULL;  }  free(salary_list);  salary_list = NULL;    return 0; }
点赞 回复
分享
发布于 2018-04-11 08:53
本人github: https://github.com/cld378632668 cld378632668 (系统领域学术研究的一定要加好友多交流) 微软预科生讨论微信群 加微信号 little_dong_dong 备注 微软和学校_想去微软哪个地区_技术方向 哈,已经有95个人了
点赞 回复
分享
发布于 2018-04-17 21:58

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务