免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 38067 | 回复: 140
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-30 11:52 |只看该作者 |倒序浏览
获奖名单已公布,详情请看:http://bbs.chinaunix.net/thread-3630628-1-1.html

程序员求职找工作,谁也逃不掉做编程面试题,这样的面试题,你做过吗?
1,二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。



2,青蛙跳台阶问题
(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
(2)一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?

活动流程:
1.请将你的答案跟帖回答
2我们邀请了何海涛老师对参与者的回复进行评选,将根据提交的思路及答案评选出5个获奖者。
3.获奖者均可获得图书《剑指Offer:名企面试官精讲典型编程题》1本。

活动时间:2011-11-30——2011-12-14

活动要求:
参赛者以跟帖的方式提交代码,相似代码以最先提交为准。
注:严禁抄袭,一经发现,取消评选资格;


QQ截图未命名.jpg (5.34 KB, 下载次数: 38)

QQ截图未命名.jpg

1212.jpg (10.14 KB, 下载次数: 37)

1212.jpg

论坛徽章:
0
2 [报告]
发表于 2011-11-30 11:59 |只看该作者
学习下

论坛徽章:
0
3 [报告]
发表于 2011-11-30 12:15 |只看该作者
本帖最后由 kns1024wh 于 2011-11-30 13:51 编辑

回复 1# 无风之谷


(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
(2)一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?

考察是程序员的算法问题  同时也是思维逻辑问题
不算太BT的题目

参考解题思路
按照传统遍历来解题思路是这样的矩阵行列都是从小到大排好序的,要查找的话自然用二分效率比较高,
而且这样的矩阵有个性质,最左上角的元素必定是最小值,最右下角的是最大值,在一个
n*n的矩阵中,对角线的元素也是排好序的,找到对角线上的一个元素,使得这个元素小于
待查找的key,并且下一元素大于待查找的key,那么只要在这个元素的左下角矩阵和右上角
矩阵递归继续对角线查找就可以了,例如上图例子里查找7,只要找到对角线的元素4,然后
递归查找红圈的矩阵就可以了,左上角矩阵最大值4<7,右下角
矩阵最小值10>7,无需查找了,但是此题并没有告诉我们原始矩阵是n*n的,这是比较麻烦的
地方,不过思路是一样的,无非不能用对角线查找这样简单的办法了,假设m*n的矩阵,对角线
查找的办法改进为i = (m1+m2)/2,j = (n1+n2)/2 进行查找就可以了,(m1,n1)为矩阵最左上角
元素下标,(m2,n2)为最右下角元素下标

假设查找17,第一次比较10,然后比较25,然后比较13,返回元素13,这时候再递归查找13
左下角的矩阵和右上角的矩阵就可以了(红色椭圆部分);如果是查找9,第一次比较10,然后比较4,
然后比较然后比较6,返回元素6,这时候递归查找6左下角的矩阵和右上角矩阵(绿色椭圆部分)
代码如下:
a是二维数组首地址,(m1, n1)左上角坐标,(m2, n2)右下角坐标,参数n是矩阵一行的元素个数
int binsearch(int value, int *a, int n, int m1, int n1, int m2, int n2)
{
        int begin_m1 = m1, begin_n1 = n1, end_m2 = m2, end_n2 = n2;
        int left_result = 0,  right_result = 0;
        int i = (m1+m2)/2, j = (n1+n2)/2;
        if (value < *(a+m1*n+n1) || value > *(a+m2*n+n2))
                return 0;
        else if (value == *(a+m1*n+n1) || value == *(a+m2*n+n2))
                return 1;

        while ((i!=m1 || j!=n1) && (i!=m2 || j!=n2)){
                 if ( value == *(a+i*n+j) )
                         return 1;
                 else if ( value < *(a+i*n+j) ){
                         m2 = i;
                         n2 = j;
                         i = (i+m1)/2;
                         j = (j+n1)/2;
                  }
                 else{
                         m1 = i;
                         n1 = j;
                         i = (i+m2)/2;
                         j = (j+n2)/2;
                 }
           }
           
           //search left & right
           if ( i<end_m2 )
                   left_result = binsearch(value, a, n, i+1, begin_n1, end_m2, j);
           if ( j<end_n2 )
                   right_result = binsearch(value, a, n, begin_m1, j+1, i, end_n2);
           if (left_result | right_result )
                   return 1;
           else
                   return 0;
}

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
4 [报告]
发表于 2011-11-30 12:31 |只看该作者
这个题有难度。看看。

论坛徽章:
0
5 [报告]
发表于 2011-11-30 12:49 |只看该作者
占位学习~

论坛徽章:
0
6 [报告]
发表于 2011-11-30 13:13 |只看该作者
编程 不懂写

不过青蛙跳到1000阶累死它

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
7 [报告]
发表于 2011-11-30 13:25 |只看该作者
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

设二维数组的大小是 x * y
那么从 a = x / 2 , b = y / 2 里的元素开始对比,对比出结果以该点构成新的矩阵
再从 a = a / 2; b = b / 2 或者 a = (x-a)/2; b= b/2 对比 或者 。。 或者  。。 (四种情况)
整体的算法就是一直把矩阵平分成四块,做四次if判断,判断要查找的元素在那个块里再重复上一次的查找

论坛徽章:
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
8 [报告]
发表于 2011-11-30 13:55 |只看该作者
  1. unsigned int count2_1(unsigned int num)
  2. {
  3.         if (num <= 2)
  4.         {
  5.                 return num;
  6.         }

  7.         unsigned int a = 1;  
  8.         unsigned int b = 2;  
  9.         unsigned int tmp;  
  10.         for(unsigned int i = 3; i <= num; ++i)  
  11.         {  
  12.                 tmp = a;  
  13.                 a = b;  
  14.                 b += tmp;  
  15.         }  
  16.         return b;  
  17. }

  18. unsigned int count2_2(unsigned int num)
  19. {
  20.         assert(num <= sizeof(unsigned int) * 8);
  21.         return 2 << (num - 1);
  22. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2011-11-30 14:15 |只看该作者
假设青蛙从平地第0级阶梯跳起,很明显啊,它可以跳到第1和第2啊。
假设青蛙已经跳到了第n-2级阶梯,很明显啊,它累了,它用力跳两级就跳到了n级。
假设还是这只青蛙,已经跳到了第n-1级阶梯,很明显啊,它累了,它轻轻跳了一级终于跳完了。
乱了。。 是不是f(n)=f(n-1)+f(n-2)?

第一次回帖,穷人求加分,求书,求美眉。

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:192015年迎新春徽章
日期:2015-03-04 09:57:09
10 [报告]
发表于 2011-11-30 14:29 |只看该作者
占位学习……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP