常见面试题学习(2)
来自:
http://www.cnblogs.com/hlxs/archive/2011/08/24/2151828.html
1. 数组相关
在排序找出数组中的两个数,他们之和为n
2. 数组中连续的数字之和为n的所有对数
3. 输出所以字符串的排列与组合
4. 序列化分问题
1. 数组相关
在排序找出数组中的两个数,他们之和为n,当然如果数组不是有序的,先排序在找时间复杂度O(nlogn + n),更简单的当然还是hash或者如果元素不重复的话位图,bloom filter更好
#include <iostream>
using namespace std;
//在排序找出数组中的两个数,他们之和为n
//两个指针,一个指向开始,一个指向结尾,比较他们指向的数的和与n的大小
//比n小,则begin ++,比n大,则end --,直到begin !< end
void findTow(int *a,int size,int n)
{
if(n < 1 || size < 1)
return ;
int begin = 0,end = size -1;
while(begin < end)
{
if(a[begin] + a[end] < n)
{
++begin;
}
else if(a[begin] + a[end] > n)
{
--end;
}
else
{
cout << a[begin] << " " << a[end] << endl;
break;
}
}
}
int main()
{
int a[10] = {1,2,3,4,6,7,8,9,10,13};
findTow(a,10,20);
return 0;
}
2. 数组中连续的数字之和为n的所有对数
#include <iostream>
using namespace std;
void findContinueSequence(int *a,int size,int n)
{
if(size < 1 || n < 1)
return;
int begin = a[1];
int begin_i = 1;
int end = a[2];
int end_i = 2;
int sum = begin + end;
while(begin_i < size)
{
if(sum == n)
{
cout << begin << " " << end << endl;
for(int i = begin_i;i < end_i; i ++)
cout << a[i] << " ";
cout << endl;
}
while(sum > n)
{
sum -= begin ++;
begin_i ++;
if(sum == n)
{
cout << begin << " " << end << endl;
for(int i = begin_i;i < end_i; i ++)
cout << a[i] << " ";
cout << endl;
}
}
sum += ++ end;
++ end_i;
}
}
int main()
{
int a[10] = {1,2,3,4,6,7,8,9,10,13};
findContinueSequence(a,10,40);
return 0;
}
3. 输出所以字符串的排列与组合
排列(下转自:http://www.cnblogs.com/dolphin0520/archive/2011/07/10/2102174.html )
对给出的n个数,求出其所有的排列。
思路:对于R={r1,r2,r3.......rn},其全排列可以这样去计算,
perm(R)=riperm(R-ri);(1<=i<=n)
即以ri为前缀不变,对剩下所有的元素进行排列。即分别以r1,r2,r3,....rn作为前缀不变,对剩下的所有元素进行全排列即为所得到的结果。同理对于perm(R-ri)的求解也是一个相同的过程,因此可以采用递归的思想去解决。
#include <iostream>
using namespace std;
void permutation(char *a,int start,int n)
{
int end = n ;
if(start == end)
{
cout << a << endl;
return ;
}
else
{
static char tmp = NULL;
for(int i = start; i < end; i ++)
{
tmp=a[start];
a[start]=a[i];
a[i]=tmp;
permutation(a, start+1,n);
tmp=a[start];
a[start]=a[i];
a[i]=tmp;
}
}
}
int main()
{
char a[] = "wtx";
int len = 0;
for(int i = 0;a[i] != '\0'; i ++)
len ++;
permutation(a,0,len);
return 0;
}
组合,也不是很懂,明天在说
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <iterator>
using namespace std;
void combine1(char* str, int num, vector<char>& res)
{
if(num== 0)
{
vector<char>::iterator iter = res.begin();
for(; iter < res.end(); ++ iter)
{
cout<< *iter<<"\t";
}
cout<<endl;
}else{
if(*str == '\0')
{
return;
}
res.push_back(*str);
combine1(str + 1, num - 1, res);
res.pop_back();
combine1(str + 1, num, res);
}
}
void combine(char* str)
{
if(str == NULL)
{
return;
}
int length = strlen(str);
vector<char> res;
for(int i = 1; i <= length; ++ i)
{
combine1(str, i, res);
}
}
int main()
{
char a[] = "wtx";
combine(a);
return 0;
}
4. 序列化分问题
#include <iostream>
using namespace std;
int f(int n,int m)
{
if(m == 1|| m == n)
return 1;
else
return f(n - 1,m - 1) + f(n - 1, m) * m;
}
int main()
{
int n;
cin >> n;
int sum = 0;
for(int i = 1;i <=n;i ++)
{
sum += f(n,i);
}
cout << sum << endl;
return 0;
}
一个不会敲代码的程序员
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述