免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

这样的面试题,你会吗?(有奖) [复制链接]

论坛徽章:
381
CU十二周年纪念徽章
日期:2014-01-04 22:46:58CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-03-13 15:38:15CU大牛徽章
日期:2013-03-13 15:38:52CU大牛徽章
日期:2013-03-14 14:08:55CU大牛徽章
日期:2013-04-17 11:17:19CU大牛徽章
日期:2013-04-17 11:17:32CU大牛徽章
日期:2013-04-17 11:17:37CU大牛徽章
日期:2013-04-17 11:17:42CU大牛徽章
日期:2013-04-17 11:17:47CU大牛徽章
日期:2013-04-17 11:17:52CU大牛徽章
日期:2013-04-17 11:17:56
11 [报告]
发表于 2011-11-30 15:03 |只看该作者
这个是什么,不会啊

论坛徽章:
0
12 [报告]
发表于 2011-11-30 15:42 |只看该作者
学习了。。。。数组算法的问题!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
13 [报告]
发表于 2011-11-30 16:33 |只看该作者
  1. #define X        4
  2. #define Y        5

  3. int array[Y][X] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}, {9, 10, 13, 16}};

  4. bool my_find(unsigned int x0, unsigned int y0, unsigned int x1, unsigned y1, int num)
  5. {
  6.         unsigned x = (x0 + x1) / 2;
  7.         unsigned y = (y0 + y1) / 2;

  8.         if (array[y][x] == num)
  9.                 return true;
  10.         if (x0 == x1 && y0 == y1)
  11.                 return false;

  12.         if (array[y][x] > num)
  13.                 return my_find(x0, y0, x, y, num);
  14.         if (array[y + 1][x + 1] <= num)
  15.                 if (my_find(x + 1, y + 1, x1, y1, num))
  16.                         return true;
  17.         return my_find(x + 1, y0, x1, y, num) || my_find(x0, y + 1, x, y1, num);
  18. }

  19. bool find_num(int num)
  20. {
  21.         return my_find(0, 0, X - 1, Y - 1, num);
  22. }

  23. //        cout << find_num(12) << endl;
复制代码

论坛徽章:
0
14 [报告]
发表于 2011-11-30 17:18 |只看该作者
第二题:1、(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
   -------f(1)= 1; f(2)=2; f(n) = f(n-1)+f(n-2);
        2、一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?
      -------可以理解成有1~n位,可以跳(1),可以不跳(0);故结果为00...00~111...111? 2^(n-1)?

论坛徽章:
0
15 [报告]
发表于 2011-11-30 18:04 |只看该作者
青蛙问题1:

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
16 [报告]
发表于 2011-11-30 18:29 |只看该作者
hellioncu 发表于 2011-11-30 13:55



    count2_2中有误,num应不能等于零,后面是1<<,不是2<<

论坛徽章:
0
17 [报告]
发表于 2011-11-30 19:19 |只看该作者
请老师点评一下呀,我不是很确定我有没有想漏。
青蛙台阶的第二题:
面对N个台阶,青蛙有N种选择:一次跳上去,分两次跳上去,……分N-1次跳上去,这是一个组合问题,所有组合数相加为2^(N-1)种。
青蛙会不会往下跳呢,如果可以就悲剧了。

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
18 [报告]
发表于 2011-11-30 19:31 |只看该作者
不会的何其多

论坛徽章:
0
19 [报告]
发表于 2011-11-30 22:46 |只看该作者
回复 17# lf541513

结果是正确的,但是步骤跳的太大了

论坛徽章:
0
20 [报告]
发表于 2011-11-30 23:25 |只看该作者
1.第一种做法,对每行或每列进行二分查找,则效率为R*log(C)或C*log(R)。
   第二种想法,是不断地将查找范围向右上角缩小,具体做法见代码,也是采用了二分。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;

  5. int mat[1005][1005];
  6. int R,C,Q;  //R表示行数,C表示列数,Q表示要查询的数

  7. int f(int x1,int y1,int x2,int y2){
  8.     int l,r,m;
  9.     if(x1==x2){
  10.         l=y1,r=y2;
  11.         while(l<=r){
  12.             //printf("====%d\n",m);
  13.             m=(l+r)>>1;
  14.             if(Q>mat[x1][m])
  15.                 l=m+1;               
  16.             else if(Q<mat[x1][m])
  17.                 r=m-1;
  18.             else return m;
  19.         }
  20.     }
  21.     else {
  22.         l=x1,r=x2;
  23.         while(l<=r){
  24.             //printf("++++%d\n",m);
  25.             m=(l+r)>>1;
  26.             if(Q>mat[m][y1])
  27.                 l=m+1;
  28.             else if(Q<mat[m][y1])
  29.                 r=m-1;
  30.             else return m;
  31.         }
  32.     }
  33.     return l;
  34. }

  35. bool Find(int x1,int y1,int x2,int y2){
  36.     int i,j;
  37.     int flag=0;
  38.     while(y1>=1 && y1<=C && x2>=1 && x2<=R && flag==0){
  39.         printf("%d %d %d %d\n",x1,y1,x2,y2);        
  40.         if(x1==x2 || y1==y2)
  41.             flag++;
  42.         i=f(x2,y1,x2,y2);
  43.         if(Q==mat[x2][i])
  44.             return true;
  45.         j=f(x1,y1,x2,y1);
  46.         if(Q==mat[j][y1])
  47.             return true;
  48.         y1=i;
  49.         x2=j-1;
  50.         printf("%d %d %d %d\n",x1,y1,x2,y2);
  51.     }
  52.     return false;
  53. }

  54. int main(){
  55.     freopen("in.txt","r",stdin);
  56.     freopen("out.txt","w",stdout);

  57.     while(~scanf("%d%d",&R,&C)){
  58.         memset(mat,-1,sizeof(mat));
  59.         int i,j;
  60.         for(i=1;i<=R;i++){
  61.             for(j=1;j<=C;j++){
  62.                 scanf("%d",&mat[i][j]);
  63.             }
  64.         }
  65.         scanf("%d",&Q);
  66.         if(Find(1,1,R,C)){
  67.             puts("Found!");
  68.         }
  69.         else {
  70.             puts("Not found!");
  71.         }
  72.     }
  73. }
复制代码
2.(1)其实就是一个菲波那契数列,可以用矩阵的快速乘法来得到一个log(N)的算法,具体见代码,但因为精度问题,只能算到N=91时的情况。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;

  5. typedef long long LL;

  6. struct Matrix{
  7.     int r,c;
  8.     LL mat[5][5];

  9.     void init(int rr=0,int cc=0){
  10.         r=rr,c=cc;
  11.         memset(mat,0,sizeof(mat));
  12.     }
  13. };

  14. void mul(Matrix &m1,Matrix &m2,Matrix &m3){
  15.     Matrix temp;
  16.     temp.init(m1.r,m2.c);

  17.     for(int i=1;i<=m1.r;i++){
  18.         for(int j=1;j<=m2.c;j++){
  19.             for(int k=1;k<=m1.c;k++){
  20.                 if(m1.mat[i][k]>0 && m2.mat[k][j]>0){
  21.                     temp.mat[i][j]=temp.mat[i][j]+m1.mat[i][k]*m2.mat[k][j];
  22.                 }
  23.             }
  24.         }
  25.     }
  26.     m3.init(temp.r,temp.c);
  27.     for(int i=1;i<=temp.r;i++){
  28.         for(int j=1;j<=temp.c;j++){
  29.             m3.mat[i][j]=temp.mat[i][j];
  30.         }
  31.     }
  32. }

  33. LL Work(Matrix &temp,Matrix &res,int N){
  34.     N--;
  35.     while(N){
  36.         if(N & 1){
  37.             mul(temp,res,res);
  38.         }
  39.         mul(temp,temp,temp);
  40.         N>>=1;
  41.     }
  42.     return res.mat[2][1];
  43. }

  44. int main(){
  45.     Matrix temp,res;   
  46.     int N=0;
  47.    
  48.     while(~scanf("%d",&N)){  //N<=91
  49.         //init
  50.         res.init(3,2);
  51.         res.mat[1][1]=1,res.mat[2][1]=1;
  52.         temp.init(3,3);
  53.         temp.mat[1][1]=0,temp.mat[1][2]=1,temp.mat[2][1]=1,temp.mat[2][2]=1;
  54.         //work
  55.         printf("%d: %lld\n",N,Work(temp,res,N));
  56.     }
  57. }

复制代码
(2).这个……应该就是2^(N-1)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP