微软2022暑期实习笔试题——题目及自己写的答案
微软暑期2022实习笔试题
- 第一题:数组内移动最小次数
-
题目
Given a sorted array like [1,2,4,4,4]. Each element in the array should occur exactly same number of times as element. For Example 1 should occur 1 time, 2 should occur 2 times, n should occur n times, After minimum number of moves, the array will be rendered as [1,4,4,4,4]
public int minMoves(int[] data) { int minOperations = 0; for(int i = 0, j = 0; i < data.length; i = j) { while (j < data.length && data[i] == data[j]) j++; int frequency = j - i; minOperations += Math.min(Math.abs(data[i] - frequency), frequency); } return minOperations; }
- 第二题:求公司项目最大项目价值
- 题目:
import ( "math" ) func Solution(V []int, A []int, B []int) int { // write your code in Go 1.4 maxValueWithDependency := 0 requirementMap := make(map[int]int, len(B)) for i := 0; i < len(B); i++ { // if requirements num > 1, skip the project if _, ok := requirementMap[B[i]]; ok { requirementMap[B[i]] = -1 continue } requirementMap[B[i]] = A[i] } for i := range B { // requirement project > 1 if requirementMap[B[i]] == -1 { continue } // requirement project is requiring another project if _, ok := requirementMap[A[i]]; ok { continue } value := V[B[i]] + V[A[i]] if value > maxValueWithDependency { maxValueWithDependency = value } } maxValue, secondMaxValue := math.MinInt32, math.MinInt32 for i := range V { if _, ok := requirementMap[i]; ok { continue } if V[i] > maxValue { secondMaxValue = maxValue maxValue = V[i] } else if V[i] > secondMaxValue { secondMaxValue = V[i] } } if secondMaxValue > 0 { maxValue = maxValue + secondMaxValue } if maxValue > maxValueWithDependency { return maxValue } else { return maxValueWithDependency } }
- 第三题:求旅游完所有景点需要的最少天数
- 题目,我从csdn上找了一个类似的,题解也几乎模仿他来的,不过最后一步左移,出现了差一问题,所以我只好在结果那里进行手动步增
public int solution(int[] A) { // write your code in Java SE 8 int tripLen = A.length; if (tripLen == 0) return 0; if (tripLen == 1) return A[0]; HashSet<Integer> locations = new HashSet<>(); HashMap<Integer, Integer> countMap = new HashMap<>(); int begin = 0; int end = 0; int min_vac = Integer.MAX_VALUE; for (int location : A) locations.add(location); for (int location : A) countMap.put(location, 0); while (end < tripLen) { int loc = A[end]; if (countMap.containsKey(loc)) countMap.put(loc, countMap.get(loc) + 1); boolean isTravelDone = true; for (Integer location : locations) { if (countMap.get(location) <= 0) isTravelDone = false; } while (isTravelDone) { min_vac = Math.min(min_vac, end - begin); int loc_s = A[begin]; begin++; countMap.put(loc_s, countMap.get(loc_s) - 1); if (countMap.get(loc_s) <= 0) isTravelDone = false; } end++; } return min_vac + 1; }
祝各位顺利通过笔试!
final result