【欢聚时代】真题-找出指定数在数组中的范围

【欢聚时代】真题-找出指定数在数组中的范围

题目描述

输入一个排好序的整数数组,找到指定目标数的开始和结束位置。
如果指定的数字不在数组中,则输出 [-1,-1]
例如,输入数组为[5, 7, 7, 8, 8, 10], 目标数为8, 输出[3, 4].
本题会人工判题,要求时间复杂度O(logn)

输入描述

输入数据包括两行:
第一行两个整数n(1 ≤ n ≤ 10 ^ 5),和需要查找的数target
第二行n个整数,范围均在32位整数内,以空格分隔

输出描述

输出格式为[begin,end],如果不存在就输出[-1,-1]

示例一

输入

6 8 5 7 7 8 8 10

输出

3 4

说明

参考解题 C

#include<stdio.h>
int main()
{
    int n,target;
    while (scanf("%d %d",&n,&target)!=EOF)
    {
        int i,flag=0,start=-1,end=-1;
        int a[100000]={0};
        for(i=0;i<n;i++) scanf("%d",&a[i]);
        for(i=0;i<n;i++)
        {
            if(target==a[i]&&flag!=1)
            {
                start=i;
                flag=1;
            }
            if(target==a[i]&&i!=start) end=i;

        }
        if(flag==1)
        {
            printf("[");
            if(start!=-1) printf("%d",start);
            if(end!=-1) printf(",%d",end);
            else printf(",%d",start);
            printf("]\n");
        }
        else printf("[-1,-1]\n");
    }
    return 0;
}

参考解题 C++

#include<stdio.h>
int main()
{
	int n,target;
	int a[100000];
	int begin,end;
	while(scanf("%d%d",&n,&target)==2)
	{
		begin=end=-1;
		for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
		for(int i=0;i<n;i++)
		{
			if(target==a[i]&&begin==-1)
			begin=end=i;
			if(target==a[i]&&begin!=-1)
			end=i;
		}
		printf("[%d,%d]",begin,end);
	}
	return 0;
}

参考解题 Java

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int target = scan.nextInt();
        scan.nextLine();
        int[] nums = new int[n];
        for(int i=0; i<n; i++){
            nums[i] = scan.nextInt();
        }
        System.out.println("["+searchRange(nums,target)[0]+","+searchRange(nums,target)[1]+"]");
    }
    public static int[] searchRange(int[] nums, int target) {
        int[] ans = {-1,-1};
        if(nums == null || nums.length == 0) return ans;
        int low = 0, high = nums.length-1;
        if(low == high && nums[0] == target) return new int[] {0,0};
        while(low < high){
            int mid = low + (high-low)/2;
            if(nums[mid] < target){
                low = mid + 1;
            }else{
                high = mid;
            }
            if(low == high && nums[low] == target){
                ans[0] = low;
            }
        }
        low = 0; high = nums.length-1;
        while(low < high){
            int mid = low + (high-low+1)/2;
            if(nums[mid] > target){
                high = mid - 1;
            }else{
                low = mid;
            }
            if(low == high && nums[low] == target){
                ans[1] = low;
            }
        }
        return ans;
    }
}

参考解题 Python

n,target = list(map(int,input().split()))
s = list(map(int,input().split()))
a = []
for i in range(n):
  if s[i] == target:
    a.append(i)
if len(a) == 0:
  print("[-1,-1]")
else:
  print("[%d,%d]"%(a[0],a[-1]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AmosCloud2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值