这是“破解编码访谈”中的编码问题,我用C ++编写 问题是:
给定一个排列有空字符串的字符串排序数组,编写一个方法来查找给定字符串的位置。
示例:在“ball”
中查找[“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”,“”, “dad”, “”, “”]
将返回4
示例:在“ballcar”
中查找[“at”, “”, “”, “”, “”, “ball”, “car”, “”, “”, “dad”, “”, “”]
将返回-1
以下是我的代码和测试用例:
#include <iostream>
#include<string>
using namespace std;
int search(string s[], int left, int right, string x)
{
if(left>right)
{
//cout<<"haha"<<endl;
return -1;
}
int mid=(left+right)/2;
if(s[mid]=="")
{
int t=mid;
while(t<right && s[++t]==""){}
if(t==right)
{
return search(s, left, mid-1, x);
}
else
{
mid=t;
}
}
if(s[mid]==x)
{
//cout<<mid<<endl;
return mid;
}
else if(s[mid]>x)
search(s, left, mid-1, x);
else
search(s, mid+1, right, x);
}
int main()
{
string s[27] = {
"at", "", "", "", "ball", "", "", "car", "", "", "dad", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
};
cout<<search(s, 0, 26, "ball")<<endl;
cout<<search(s, 0, 26, "car")<<endl;
cout<<search(s, 0, 26, "dad")<<endl;
cout<<search(s, 0, 26, "chunlei")<<endl;
system("PAUSE");
return 0;
}
但是,它们总是会产生wield结果,当我在返回之前尝试cout时,我可以看到结果是正确的,但在main函数中,返回值总是错误的。任何人都可以帮我看看为什么会这样吗?谢谢!
答案 0 :(得分:3)
您忘记将搜索结果返回到其他地方,否则会阻止。 例如,替换
search(s, left, mid-1, x);
带
return search(s, left, mid-1, x);
答案 1 :(得分:0)
首先,该函数应至少声明为
int search( const string s[], int left, int right, const string &x );
而不是与
类似的比较if(s[mid]=="")
最好使用
if ( s[mid].empty() )
而不是带有后面的while循环语句的if语句
if(s[mid]=="")
{
int t=mid;
while(t<right && s[++t]==""){}
编写
会更简单 int t = mid;
while ( t < right && s[t].empty() ) ++t;
然后进行所有其他比较。
在thsi代码段中
else if(s[mid]>x)
search(s, left, mid-1, x);
else
search(s, mid+1, right, x);
你忘记了回归。应该有
return s[mid] > x ? search(s, left, mid-1, x) : search(s, mid+1, right, x);
然而,这种方法是错误的,因为所有处理数组的函数都被声明为
int search(const string s [],int n,const string&amp; x);
其中n是数组的大小。
如果您使用迭代器而不是索引,我可以使用四个参数来声明函数的声明。
现在尝试编写声明为
的相同递归函数int search( const string s[], int n, const string &x );
并仅使用operator <
。这是一项更艰巨的任务。:)