百度面试标题:一组排好序数组,输入一个数找出这个数出现在数组(可能有多个重复数字)的首末位置,要求不能使用遍历方法

百度面试题目:一组排好序数组,输入一个数找出这个数出现在数组(可能有多个重复数字)的首末位置,要求不能使用遍历方法。
百度面试题目:一组排好序数组,输入一个数找出这个数出现在数组(可能有多个重复数字)的首末位置,要求不能使用遍历方法。
------解决思路----------------------
他的意思是一次二分找到首,一次二分找到尾?
像这样

#include <stdio.h>
//data非递减排序,n是个数,key是关键字
int head(int *data, int n, int key)
{
    int s, e, m;
    s = 0;
    e = n - 1;

    while(s <= e) {
        m = (s + e) >> 1;
        if(data[m] >= key)
            e = m - 1;
        else
            s = m + 1;
    }
    if(data[s] == key)
        return s;
    else
        return -1;
}

int tail(int *data, int n, int key)
{
    int s, e, m;
    s = 0;
    e = n - 1;

    while(s <= e) {
        m = (s + e) >> 1;
        if(data[m] <= key)
            s = m + 1;
        else
            e = m - 1;
    }
    if(data[e] == key)
        return e;
    else
        return -1;
}

int main()
{
    int test[] = {0, 1, 2, 3, 3, 3, 3, 4, 5, 6, 7, 8};

    printf("head index :%d; tail index: %d\n",
           head(test, 12, 3), tail(test, 12, 3));
    return 0;
}


你也可以整合成一个函数
注:这里没有对参数做安全检测