careercup-排序和查找 11.5
11.5 有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串的位置。
解法:
如果没有那些空字符串,就可以直接使用二分查找法。比较待查找字符串str和数组的中间元素,然后继续搜索下去。针对数组中散布一些空字符串的情形,我们可以对二分查找法稍作修改,所需的修改就是mid进行比较的地方,如果mid为空字符串,就将mid换到离它最近的非空字符串的位置。
C++实现代码:
#include<iostream> #include<string> #include<vector> using namespace std; int searchR(vector<string> &str,int left,int right,string s) { if(left>right) return -1; int mid=(left+right)/2; if(str[mid].empty()) { int l=mid-1; int r=mid+1; while(1) { if(l<left&&r>right) return -1; if(l>=left&&!str[l].empty()) { mid=l; break; } if(r<=right&&!str[r].empty()) { mid=r; break; } l--; r++; } } if(str[mid]==s) return mid; else if(s<str[mid]) return searchR(str,left,mid-1,s); else return searchR(str,mid+1,right,s); } int search(vector<string> &str,string s) { return searchR(str,0,str.size()-1,s); } int main() { vector<string> vec= {"","abc","","hfh","jhfh","kdhf","","sss","zzz",""}; cout<<search(vec,string("zzz"))<<endl; }