首页 > 编程语言 > 详细

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

时间:2020-03-13 17:35:52      阅读:61      评论:0      收藏:0      [点我收藏+]

题目:

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

示例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);
        }
    }
}

 

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

原文:https://www.cnblogs.com/silentteller/p/12487566.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!