程序员面试金典-面试题 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); } } }