微软SWE一面面经

面试官首先让介绍自己,然后问了下项目经历就开始撕代码了。一共两道题:

  • 给一个数组,求出长度为偶数的连续子数组的和的最大值。和leetcode上一道题类似,但原题对子数组长度的奇偶性没有要求。

  • 给定一个长度为n的数组,该数组中的每个元素在1到n范围内,要求在O(n)的时间复杂度,O(1)的空间复杂度下,打印1到n这n个数各出现了多少次。

第二道题不是很有思路,求知道的同学可以留言下思路。

#微软##实习##C++工程师##面经#
全部评论
第二题感觉本质就是让一个数组能够存储两种信息,一个是当前index这个数字出现的个数,另一个就是要确认这个index上的数字是否在正确的位置上。 方法一可以参考leetcode 41,吧当前index上的数字和他应该属于的index上面的数字进行交换, 比如a[10]上面放了11就不需要移动,放了8的话就把8和a[7]上面的数字进行交换。而当交换成功之后为了标记当前位置即a[7]上面的数字已经到了正确位置,则可以采取前面楼层的做法,比如把这个数字置为负数比如-1,然后每次有数字移动到这个index7上的时候,-1减一,最后当前index+1这个数字出现的次数就是此位置负数变正再减一。 方法二就是如果这数组的数字比较小的话,当前位置这个数字是一个interger,有32位,可以用前16位去存当前index+1这个数字的出现的次数。这就有点取巧了。 总之这题主要就是通过用一个数组存储两种信息,不管是用正负来代替boolean,还是用interger或者long多出来的位数存储,核心就是如何用一个数组存2N的信息。
3 回复 分享
发布于 2020-03-18 08:25
应该是用数组下标代替某个数字
2 回复 分享
发布于 2020-03-17 20:21
第二题在网上找到了解法  可以参考一下   https://blog.csdn.net/hjwang1/article/details/81048396
1 回复 分享
发布于 2020-03-18 10:59
lz是面的哪里微软?北京 ?
1 回复 分享
发布于 2020-03-17 20:16
第二题这么高, 对于每个数字: int pos = nums[i] % n + 1; nums[pos] += n; 最后 暴力统计就好了。。
点赞 回复 分享
发布于 2020-03-20 19:33
请问你收到下一面通知了嘛?中间大概隔了多久呀?
点赞 回复 分享
发布于 2020-03-20 18:37
具体什么岗位啊?
点赞 回复 分享
发布于 2020-03-20 15:45
你是实习还是春招啊
点赞 回复 分享
发布于 2020-03-20 15:14
第二题我感觉有两种吧,如果数组是给出的可以存数的数组,不是单独给的n个数字,sort后二分相减就行;另外一种,如果n不大的话,搞一个n进制大数就行了
点赞 回复 分享
发布于 2020-03-18 10:40
楼主面试是用teams吗?写代码怎么写啊?在本地的IDE还是teams里面有类似编辑器的应用?😲
点赞 回复 分享
发布于 2020-03-18 10:24
第一题应该怎么做呢?
点赞 回复 分享
发布于 2020-03-18 09:57
第2题我和3楼想的一样,将每个nums[i]换到对应的位置nums[i]-1上并把它变成负数,然后如果原本这个位置上的数>0且<i,就继续找,刚写了下代码是可以的
点赞 回复 分享
发布于 2020-03-17 21:29
请问是春招吗,还是21届的实习
点赞 回复 分享
发布于 2020-03-17 20:54
第二题遍历数组,res[nums[i] - 1]++就行了吧
点赞 回复 分享
发布于 2020-03-17 20:24

相关推荐

03-20 11:10
已编辑
大连民族大学 Java
点赞 评论 收藏
分享
评论
6
36
分享

创作者周榜

更多
牛客网
牛客企业服务