《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及解释。
这里讲的也是二分搜索,没什么特别的只是在中值处遇到空字符串时需要将索引移位后再进行比较。
//迭代法
int search(vector<string> strings, string str, int first, int last)
{
while (first <= last)
{
int mid = (last + first) / 2;
if (strings[mid]=="")
{
int left = mid - 1;
int right = mid + 1;
while (true)
{
if (left < first && right > last)
{
return -1;
}
else if (right <= last && strings[right]!="")
{
mid = right;
break;
}
else if (left >= first && strings[left] != "")
{
mid = left;
break;
}
right++;
left--;
}
}
int res = strings[mid].compare(str);
if (res == 0)
{
return mid;
}
else if (res < 0)
{
first = mid + 1;
}
else
{
last = mid - 1;
}
}
return -1;
}
//递归法
int search(vector<string> strings, string str,int low,int high)
{
if (low > high)
return -1;
int mid = (low + high) / 2;
if (strings[mid] == "")
{
int left = mid - 1;
int right = mid + 1;
while (true)
{
if (left<low && right>high)
{
return - 1;
}
else if (right<=high && strings[right]!="")
{
mid = right;
break;
}
else if(left >= low && strings[left] != "")
{
mid = left;
break;
}
right++;
left--;
}
}
if (!strings[mid].compare(str))
{
return mid;
}
else if (strings[mid].compare(str)<0)
{
return search(strings, str, mid+1, high);
}
else
{
return search(strings, str, low, mid-1);
}
}
int search(vector<string> strings,string str)
{
if ((strings.size() == 0) || (str == ""))
return -1;
return search(strings, str, 0, strings.size()-1);
}