小明找位置

小明找位置

问题

小朋友站队,按学号从小到大排成一列。小明来迟了,请你给小明出个主意,让他尽快找到他应该排的位置。算法复杂度要求不高于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开始
    }
}

这个程序首先读取输入的学号队列和小明的学号,然后使用二分查找法找到小明应该排的位置,并输出结果。

代码说明

  1. 输入处理

    • 通过 Scanner 读取输入,将学号队列和小明的学号分别存储在数组和变量中。
  2. 二分查找

    • 使用 findPosition 方法来进行二分查找,如果找到小明的学号,返回对应的位置(从1开始)。
    • 如果没找到,返回应该插入的位置(从1开始)。
  3. 输出结果

    • 输出小明的排队位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值