所有的题目转载自网络 http://bbs.youkuaiyun.com/topics/390257148?page=2 解法可以参考一下 希望有更好的解法
2012 10 25
金山笔试题
1. 一个数组{3,4,5,6,3},请输出这个数组的全排列,比如34563、43563、33456...。
BOOL ISOK(int i,int idx,int a[])
{
for(intj=idx;j<i;j++)
if(a[j]==a[i])
returnFALSE;
returnTRUE;
}
void Perm(int a[],int idx,int len)
{
if(idx==len)
{
for(inti=0;i<len;i++)
{
cout<<a[i]<<"";
}
cout<<endl;
}
else
{
for(inti=idx;i<len;i++)
{
if(ISOK(i,idx,a))
{
swap(a[i],a[idx]);
Perm(a,idx+1,len);
swap(a[i],a[idx]);
}
}
}
}
int main()
{
inta[]={1,2,2,3,3};
Perm(a,0,sizeof(a)/sizeof(int));
return0;
}
2. 编写程序编写程序编写程序编写程序:在O(n)时间复杂度内从数组array[0..n-1]中找出第k个最小的元素。 说明:算法可以对array中的元素进行排序。
int Handle(int a[],int random,int len)
{
swap(a[random],a[len-1]);
intj=-1;
inti;
for(i=0;i<len-1;i++)
{
if(a[i]<a[len-1])
swap(a[++j],a[i]);
}
swap(a[++j],a[len-1]);
returnj;
}
int Find(int a[],int k,int len)
{
if(len)
{
srand(time(NULL));
intrandom=rand()%(len);
intmid=Handle(a,random,len);
if(mid==len-k)
{
returna[mid];
}
elseif(mid<len-k)
{
Find(a+mid+1,k,len-mid-1);
}
else
Find(a,mid-(len-k),mid);
}
}
int main()
{
inta[]={221,3,2,4,25,1211};
cout<<Find(a,3,sizeof(a)/sizeof(int));
return0;
}
3. 综合考察综合考察综合考察综合考察:银行有个存有n个用户编号的文件,每个数都小于n,其中n=10的7次方。每个编号都不重复。输出:n个数升序排列。约束条件:内存最多有2兆的空间,运行时间复杂度为O(n)
使用STL的bitset 分两次就行了。bitset<10000000>会出错。
4. unsigned int a = 0x12345678;
printf("%x\n",*((unsignedchar*)(&a)+1)+1);
打印出什么?为什么?
57 注意a的存储方式在内存中为 78 56 34 12
4.
charstr[]="abcdefghijklmnopqrstuvwxyz";
char*pchar = str;
int*pint=(int*)(str+4);
short int *pshort=(short int*)(str+3);
printf("%c%c%c\n",*(++pchar),*((char*)(++pint)),*((char*)(++pshort)));
打印出什么?为什么?
b i f
5.
class a
{
private: int a1;
protected: int a2;
public: virtual int GetData();
};
class b:protected a
{
private: int b1;
public: int b2;
public: int GetData();
};
class c:private b
{
private :int c1;
intc2;
public: int GetData();
};
class d:public c
{
private: int d1;
public: int GetData();
};
类abcd成员函数GetData能访问的变量是?
6. 将0x1e0a转换成十进制和二进制表示。
7.某天晚上,有4个人要过桥,都在桥的一边,有一个手电筒,一次最多过两个人,
不管几个人过桥都要手电筒,每个人过桥时间为1,2,5,10.请问他们最快多久可以过桥,
用什么方案?
8. 一个大水桶能盛容积为V,设有N个小水桶,容积为W1,W2.。。WN,希望从n个水桶中导入大水桶,
容积之和刚好到满。用非递归的方式求出所有的解。
#include <stack>
int Perm(int a[],int len,int v)
{
for(int i=0;i<len;i++)
{
std::stack<int> s;
int cur=0;
for(int j=i;j<len;j++)
{
if(cur+a[j]<v)
{
s.push(a[j]);
cur+=a[j];
}
else if(cur+a[j]>v)
{
if(!s.empty())
{
int t=s.top();
s.pop();
cur-=t;
j--;
if(s.empty())
break;
}
}
else
{
s.push(a[j]);
cur+=a[j];
std::stack<int> s1=s;
while(!s1.empty())
{
int t=s1.top();
cout<<t<<" ";
s1.pop();
}
cout<<endl;
}
}
}
return 0;
}
int main()
{
int a[]={1,2,3,4,5,6,7};
Perm(a,sizeof(a)/sizeof(int),6);
return 0;
}