感觉这道题题目有点问题,没有说是取出现的第一个还是最后一个,通过测试用例结果来看应该是取第一个出现的值。所以在得到匹配的值mid的时候,还需要做两个判断:

  1. 如果已经是数组第一个数据,直接返回mid的值
  2. 如果不是数组第一个数据,那么前面的数如果不等于当前mid的数,返回mid即可
  3. 上述均不满足的时候,把右边界调整为mid-1
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @@@@这里的要求应该是求第一个出现的值
     * 如果目标值存在返回下标,否则返回 -1
     * @param nums int整型一维数组 
     * @param target int整型 
     * @return int整型
     */
    public int search (int[] nums, int target) {
        if(nums.length==0){
            return -1;
        }
        int len = nums.length-1;
        if(nums[0]>target || nums[len]<target){
            return -1;
        }
        int p=0,q=len;
        while(p<=q){
            int mid = p + ((q-p)>> 1);
            if(nums[mid]<target){
                p = mid + 1;
            }else if(nums[mid]>target){
                q = mid - 1;
            }else{
                if(mid == 0 || nums[mid-1]!=target){
                    return mid;
                }else{
                    q = mid - 1;  
                }
            }
        }
        return -1;
    }


}