小明找位置
问题
小朋友站队,按学号从小到大排成一列。小明来迟了,请你给小明出个主意,让他尽快找到他应该排的位置。算法复杂度要求不高于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
题解
你可以使用二分查找法来实现这个问题,保证算法复杂度为 (O(\log n))。以下是用 Java 实现的代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取第一行输入
String[] strNumbers = scanner.nextLine().split(" ");
int[] numbers = new int[strNumbers.length];
for (int i = 0; i < strNumbers.length; i++) {
numbers[i] = Integer.parseInt(strNumbers[i]);
}
// 读取第二行输入
int xiaoMingNumber = scanner.nextInt();
// 找到小明的位置
int position = findPosition(numbers, xiaoMingNumber);
// 输出位置
System.out.println(position);
}
public static int findPosition(int[] numbers, int target) {
int left = 0;
int right = numbers.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (numbers[mid] == target) {
return mid + 1; // 找到目标值,返回位置,位置从1开始
} else if (numbers[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left + 1; // 没找到目标值,返回应该插入的位置,位置从1开始
}
}
这个程序首先读取输入的学号队列和小明的学号,然后使用二分查找法找到小明应该排的位置,并输出结果。
代码说明
-
输入处理:
- 通过
Scanner
读取输入,将学号队列和小明的学号分别存储在数组和变量中。
- 通过
-
二分查找:
- 使用
findPosition
方法来进行二分查找,如果找到小明的学号,返回对应的位置(从1开始)。 - 如果没找到,返回应该插入的位置(从1开始)。
- 使用
-
输出结果:
- 输出小明的排队位置。