程序员面试金典-面试题 10.05. 稀疏数组搜索

题目:

稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。

示例1:

输入: words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ta"
输出:-1
说明: 不存在返回-1。
示例2:

输入:words = ["at", "", "", "", "ball", "", "", "car", "", "","dad", "", ""], s = "ball"
输出:4
提示:

words的长度在[1, 1000000]之间

分析:

二分搜索,字符串比较,当中间为空串时,就去找左边的字符串比较,锁定新的区间范围。

程序:

class Solution {
    public int findString(String[] words, String s) {
        return binarySearch(words, s, 0, words.length-1);
    }
    private int binarySearch(String[] words, String s, int l, int r){
        if(l > r){
            return -1;
        }
        if(l == r){
            if(words[l].equals(s))
                return l;
            return -1;
        }
        int mid = l + (r - l) / 2;
        if(!words[mid].equals("")){
            if(s.compareTo(words[mid]) < 0){
                return binarySearch(words, s, l, mid);
            }else if(s.compareTo(words[mid]) > 0){
                return binarySearch(words, s, mid+1, r);
            }else{
                return mid;
            }
        }else{
            int left = mid-1;
            while(left >= l){
                if(words[left].equals("")){
                    left--;
                }else{
                    if(words[left].compareTo(s) < 0)
                        return binarySearch(words, s, mid+1, r);
                    else if(words[left].compareTo(s) > 0)
                        return binarySearch(words, s, l, left);
                    else
                        return left;
                }
            }
            return binarySearch(words, s, mid+1, r);
        }
    }
}

 

posted @ 2020-03-13 17:04  silentteller  阅读(267)  评论(0编辑  收藏  举报