破解编码面试,11.5,搜索

时间:2014-03-02 22:34:51

标签: c++

这是“破解编码访谈”中的编码问题,我用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函数中,返回值总是错误的。任何人都可以帮我看看为什么会这样吗?谢谢!

2 个答案:

答案 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 <。这是一项更艰巨的任务。:)