华为OD机试(C卷+D卷)2024真题目录(Java & c++ & python)
题目描述
小朋友出操,按学号从小到大排成一列;小明来迟了,请你给小明出个主意,让他尽快找到他应该排的位置。
算法复杂度要求不高于nLog(n);学号为整数类型,队列规模<=10000;
输入描述
1、第一行:输入已排成队列的小朋友的学号 (正整数),以”,”隔开
例如: 93,95,97,100,102,123,155
2、第二行:小明学号,如110;
输出描述
输出一个数字,代表队列位置 (从1开始)例如:
6
示例1
输入
93 95 97 100 102 123 155
110
输出
6
解题思路
数据较小,且仅要求不高于n*logn,那么O(n)的直接遍历也可以,这里讲一下二分查找的解法,时间复杂度为O(logn),以应对需要更优化的情况。
二分法的学习可以参考:浅谈二分法(1)
参考代码
import java.util.Scanner;public class Main {public static int findPosition(int[] arr, int target) {int left = 0;int right = arr.length;while (left < right) {int mid = left + (right - left) / 2;if (arr[mid] < target) {left = mid + 1;} else {right = mid;}}return left + 1;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取第一行String[] arrStr = scanner.nextLine().split(" ");int[] arr = new int[arrStr.length];for (int i = 0; i < arrStr.length; i++) {arr[i] = Integer.parseInt(arrStr[i]);}// 读取第二行int target = scanner.nextInt();// 输出结果System.out.println(findPosition(arr, target));scanner.close();}
}