算法工程师的一道面试题目

今天师兄去面试了一家公司(从腾讯工作出来创业),面试的是算法工程师,要他做一道题目,写出算法步骤,然后求出复杂度,然后优化。

题目:大概是,从100w的字符串中如何快速的找到兄弟字符串。

师兄的思路是:1.先算出各字符串的数字和,然后进行从小到大的排序

                        2.然后求出这个兄弟字符串

师兄666,思考了10多分钟,写出了算法,算了时间复杂度,优化,师兄说不会。(⊙﹏⊙)

后来我百度了些资料,1.知道什么是兄弟字符串?2.寻找兄弟字符串的算法用哪些?

1.如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串(如,bad和adb就是兄弟字符串)。

2.选择兄弟字符串的算法?我其实没有学习过数据结构,不过最近在学习,也没有学习过算法,但是感觉大神们每天都在倒腾这些。

先百度一份代码,用于比较两个字符串是不是兄弟字符串:

/*
如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串,
问如何在迅速匹配兄弟字符串(如,bad和adb就是兄弟字符串)。
*/

int isBroStr(char *str1, char *str2)
{
	int a[26 * 2] = { 0 };
	int i, strLen;
        if (!str1 && !str2) //或
		return 1; //返回非0 值为程序失败,报错
	else if (!str1 || !str2)//且
		return 0; 
	else
	{
		if (strlen(str1) != strlen(str2))
			return 0;
		strLen = strlen(str1);
		for (i = 0; i < strLen; i++)
		{
			++a[str1[i] - 'A'];
			--a[str2[i] - 'A'];
		}
		for (i = 0; i < 26 * 2; i++)
			if (a[i])
			    return 0; //shell 定义了,返回 0 值为成功
		return 1;
	}
}

int main()
{
    char *str1 = "";
    char *str2 = "asdfAABaab";
    if (isBroStr(str1, str2))
        cout << " String 1 and String 2 are brothers!" << endl;
    else
        cout << " String 1 and String 2 are not brothers!" << endl;
    system("PAUSE");
    return 0;
} 

然后我结合着想了想,我好久没有写了,一个小小的程序都花费了很久的时间,查了很多资料。

包括:字符串数组定义 ,点击打开链接(特别强调一下,实现代码部分很多事来自这里的,很值得看,

字符串数组

ASCII,点击打开链接

C/C++中如何获取数组的长度? 点击打开链接

代码如下:

#include <iostream> 
#include <string.h>
using namespace std;


/*
在10对字符串中求出兄弟字符串的个数,且打印出来
如果两个字符串的字符一样,但是顺序不一样,被认为是兄弟字符串(如,bad和adb就是兄弟字符串)。
*/

template <class T>
int getArrayLen(T& array)

{//使用模板定义一 个函数getArrayLen,该函数将返回数组array的长度

    return (sizeof(array) / sizeof(array[0]));

}

int isBroStr(char *str1, char *str2)
{
    int a[26 * 2] = { 0 };
    int i, strLen;
    //如果是空字符串
    if (!str1 && !str2) //或 
        return 1;//错误跳出
    else if (!str1 || !str2)//且
        return 0;
    else
    {
        if (strlen(str1) != strlen(str2))
            return 0;
        strLen = strlen(str1);
        for (i = 0; i < strLen; i++)
        {
            ++a[str1[i] - 'A'];
            --a[str2[i] - 'A'];
        }
        for (i = 0; i < 26 * 2; i++)
            if (a[i])
                return 0; //shell 定义了返回 0 值为成功
        return 1;// 没运行完,继续运行
    }
}
int main()
{
    char* a[] = { "hhn", "ddd","ddd","hhn","bbb","aaa","nhh" ,"hhn"};
    int sum = 0;
    int L = getArrayLen(a);

    for (int i = 0; i < L - 1; i++) {
        while (a[i] == "0") //如果不用while,则遇到相邻的“0”后还是会继续进行比较,这里就是针对所有的“0”不进行比较了。
        {
            i = i + 1; 
        }
        for (int j = 1; j < L - i; j++)
        {
            if (isBroStr(a[i], a[L - j]))
            {
                a[L - j] = "0";
                sum++;
            }
        }
        if (sum != 0)
        {
            cout << a[i] << "存在兄弟字符串" << ",首次出现在数组的第" << i + 1 << "位" ;
            cout << " 兄弟个数为: " << sum + 1 << endl;;
        }
        sum = 0;
    }
    system("PAUSE");
    return 0;
}

当然还可以是写成是直接输入的字符串进行查找兄弟字符串。

我感觉我可能找的不是兄弟字符串,定义是两个。而我找的是全部,是多兄弟,而且输出第一个出现的位置,和有几个兄弟,且不同家的兄弟。

这个大牛,没有给我提供帮助,但是我感觉很牛,因为看英文的数据结构和算法书。。。还有英文视频。。。

http://www.cnblogs.com/yangecnu/p/Introduction-Stack-and-Queue.html


允许转载,但是请在文章开头标明来处!谢谢啦。


猜你喜欢

转载自blog.csdn.net/qq_37791134/article/details/80023820