笔试交卷前 通过48/51测试,交卷后 显示 “编译错误” 是什么情况
笔试题:
今天做了下 美团 2026 校招全栈岗 第二批 笔试 (模拟测)
其中第一道 编程题 在做的时候 点击 “自测输入” -> “保存并提交” 后显示 "48/51 组用例通过"。
但交卷后显示 状态:编译错误
这是怎么回事?
(另外有没有人能告诉我这个思路错哪了怎么改👀)
交卷前:
交卷后:
代码:
/* When x is larger, sum() is also larger. => Find the smallest x in range [0, 0b1...1 where #1 == 0bmax(ai)'s 1s] => such that the sum() is at max Binary Search search range: x in [1, 0b1...1 where #1s == #0bmax(ai)'s digits] given that 0 <= ai < 2^30: #0bmax(ai)'s digits <= 30 search for what: First Occurrence of x such that sum() is at max assumption: as x goes up, sum() continues going up to a point and will no longer increase => Last Occurrence of x such that sum()_when_x > sum()_when_x-1 Complexity: TC: O(occurrence BS) * O(determine sum() for each x) = O(30) * O(n) ~ O(n) */ import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int numCases = in.nextInt(); for (int i = 0; i < numCases; i++) { int n = in.nextInt(); int[] arr = new int[n]; for (int j = 0; j < n; j++) { arr[j] = in.nextInt(); } Result result = smallestXLargestSum(arr); System.out.println(result.sum + " " + result.x); } } // Helpers /* Given an arr[], return the smallest x where 0bx has #digits <= 0blargest ai's #digits * such that sum(ai) is the largest. */ private static Result smallestXLargestSum(int[] arr) { int largestNumDigits = getLargestNumDigits(arr); int largestX = 1; for (int i = 1; i < largestNumDigits; i++) { // shifting & filling with 1 largestX <<= 1; largestX |= 1; } // System.out.println("largestX = " + largestX); // At this point, largestX = 0b1...1 (#1s == largestNumDigits) // initialize Occurrence BS int left = 1; int right = largestX; long prevSum = getSumWithX(0, arr); // sum() when x = 1 int midX = 0; // represent x while (left < right - 1) { midX = left + (right - left) / 2; long currSum = getSumWithX(midX, arr); if (currSum > prevSum) { // search to the right of mid (inclusive) left = midX; prevSum = currSum; } else { // prevSum >= currSum right = midX - 1; } } // post processing long sumWithRightX = getSumWithX(right, arr); if (right - 1 >= 0 && sumWithRightX > getSumWithX(right - 1, arr)) { return new Result(sumWithRightX, right); } long sumWithLeftX = getSumWithX(left, arr); if (left - 1 >= 0 && sumWithLeftX > getSumWithX(left - 1, arr)) { return new Result(sumWithLeftX, right); } else return new Result(getSumWithX(0, arr), 0); } // Given an x, return the sum() by applying the formulas. private static long getSumWithX(int x, int[] arr) { long sum = 0; for (int num: arr) { sum += num | x; x = num & x; } // System.out.println("When x = " + x + ", sum() = " + sum); return sum; } // return the #digits of binary form of the largest ai. Assert return number is in range 1 ~ 30 private static int getLargestNumDigits(int[] arr) { int max = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i] > max) max = arr[i]; } int numDigits = 0; if (max == 0) return 1; while (max > 0) { numDigits++; max >>= 1; } // System.out.println("for current arr with length = " + arr.length + ", largestNumDigits = " + numDigits); return numDigits; } } class Result { long sum; int x; public Result(long sum, int x) { this.sum = sum; this.x = x; } }#美团##美团秋招笔试##编译错误##笔试#