拼多多一面的一个面试题:在有空字符串中的有序字符串数组中查找
1943
2021.10.17
发布于 未知归属地

简介

题目
有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串(肯定不是空字符串)的索引

算法
其实就是用二分查找,本身字符串数组就是有序的,与查找数字的不同之处就在于字符串的大小比较方式不一样罢了,还有就是这里还有空字符串,所以选取mid时,如果遇到空字符串,使其往下移动一位就好了。

代码片段

public class PinduoduoOne {

    public static int search(String[] s, String target) {
        int left = 0, right = s.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            // 记录最开始的mid
            int originMid = mid;
            while (mid <= right && s[mid].equals("")) {
                mid++;
            }
            // 如果mid超过了搜索right边界,说明mid~right部分全为空串
            if (mid > right) {
                right = originMid - 1;
                continue;
            }
            // target > [mid]
            if (target.compareTo(s[mid]) > 0) {
                left = mid + 1;
            } else if (target.compareTo(s[mid]) < 0) {
                right = mid - 1;
            } else {
                return mid;
            }
        }

        return -1;
    }

    public static void main(String[] args) {
        System.out.println(search(new String[]{"ac", "", "", "", "", "", "", "", "", "ad", "b", "", "ba"}, "ac"));
        System.out.println(search(new String[]{"", "", "ac", "", "", "", "", "", "", "", "", "ad", "b", "", "ba"}, "ac"));
    }
}
评论 (2)