金山面试题目

所有的题目转载自网络 http://bbs.youkuaiyun.com/topics/390257148?page=2 解法可以参考一下 希望有更好的解法

2012 10 25

金山笔试题

1.  一个数组{34563},请输出这个数组的全排列,比如345634356333456...

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=107次方。每个编号都不重复。输出:n个数升序排列。约束条件:内存最多有2兆的空间,运行时间复杂度为On

 使用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个小水桶,容积为W1W2.。。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;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值