笔试面试题(一)

准备开始研究并整理各大公司的笔试面试题,当然主要是算法题。有些答案是我自己写的,有些答案则是来自网上。可能会有些错误,欢迎大家指正!如果你有更好的解答,欢迎和大家分享,一起学习一起进步!

本篇主要集中谷歌的笔试面试题:

1 . 写一个函数对字符串数组排序,使得所有的变位词都相邻。

2 . 给一个字符串S,写一个函数:当S=nT(T是S的子串,n大于等于2)时返回true,否则返回false。例如S="abab"返回true,S="abac"返回false,S="zzxzzxzzx"返回true,S="zzxzzyzzx"返回false。

3 . (全排列)输入一个字符串,打印出该字符串中字符的所有排列。








待续.....



1 .  《变位词问题》好像经常考察到,思路很简单,先将字符串按照字母表排序,排序后得到的字符串作为该单词的标识(标识相同的就是变位词)。然后再将所有字符串按其标识的顺序排序即可。这里给一段参考代码:

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

/* 二元谓词 */
bool cmp(string s1, string s2){
	sort(s1.begin(), s1.end()); // 默认升序
	sort(s2.begin(), s2.end());
	return s1 < s2;  // string支持比较操作
}

int main()
{
	string s[] = {"army","abc","zero","mary","zore","bac"};
	sort(s, s+6, cmp);  // 使用自定义的比较操作
	for(int i=0; i<6; ++i)
		cout << s[i] << " ";
	return 0;
}

2 . 这个问题我没有想出线性时间O(n)或更好的解决方法。但是有人给出了一个比线性时间更好的O(lgn)的答案。

笔试面试题(一)_第1张图片

原理如上图所示,将字符串S翻倍得到新字符串,然后从第二个字符开始用S去匹配这个新字符串,如果返回位置小于S的长度,返回true,等于S的长度返回false。参考代码:

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

bool func(string s)
{
	string new_s = s + s;
	if(new_s.find(s, 1) == s.length())
		return false;
	else
		return true;
}



你可能感兴趣的:(笔试面试题(一))