今天师兄去面试了一家公司(从腾讯工作出来创业),面试的是算法工程师,要他做一道题目,写出算法步骤,然后求出复杂度,然后优化。
题目:大概是,从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
允许转载,但是请在文章开头标明来处!谢谢啦。