面试三道题,想听听大家的意见和讨论

jihuoban 2008-10-30 04:30:51
加精
1 下面这个排序法,(1)请解释为什么它可以先快速的消除大量的错乱排序?你可以用文字说明,或者对每个循环解释为什么。(2)它的时间复杂度是多少?
void sort(int v[],int n)
{
for(gap= n/2;gap > 0;gap /=2)
for(i=gap;i<n;i++)
for(j=i-gap;j>=0 && v[j]>v[j+gap];j-=gap)
{
temp = v[j];
v[j] = v[j+gap];
v[j+gap] = temp;
}
}


2 请说明下面这个程序的输出,并给予解释
int  func(int i,int n)
{
return (i<n && printf("%d\n",i)) && !p(i+1,n)
|| printf("%d\n",i);
}


3 两个整型数,不准用if 、switch 、?:等判断语句求出两者最大值,说出你的思路,能写出代码更好
...全文
12301 293 打赏 收藏 转发到动态 举报
写回复
用AI写文章
293 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanglei101 2012-10-26
  • 打赏
  • 举报
回复
第一题:
楼主的题目是不是有弄错了啊,第三个循环最后一个j-=gap,是不是该改成j+=gap啊?求解释~~~

第二题正解:
[Quote=引用 13 楼 的回复:]

2, !p(i+1,n) 应该是 !func(i+1 ,n)
如果 i >= n,则输出i的值。
如果 i < n,则输出
i
i+1
...
n
n-1
n-2
...
i
[/Quote]


+ +
第三题:
int func(int i,int n)
{
return (i>n && printf("%d\n",i)) || printf("%d\n",n);
}
求指导啊,有没有什么不对的地方,大牛们不吝赐教啊!
swordtan 2012-10-26
  • 打赏
  • 举报
回复
mark一下,2、3比较容易,就是第1个难点
mengjiacun 2012-08-22
  • 打赏
  • 举报
回复
望楼主仔细把这些资料整理一下哈,顶一个
hhsyxxwl0601 2012-08-22
  • 打赏
  • 举报
回复
mark
danhuang 2012-08-20
  • 打赏
  • 举报
回复
话说第三题的解答:
方案一:
如一楼所说,int max=((a+b)+abs(a-b))/2

方案二:
int c=a-b;
char *strs[2] = {"a大", "b大"};
c=unsigned(c) >> (sizeof(int) * 8 -1);
smsgreenlife 2012-08-20
  • 打赏
  • 举报
回复
第三题的标准答案在这里,好多人知道这种思路,但没有注意到一些细节,结果程序是错的。
int a;
int b;
int m[2];
m[0] = a;
m[1] = b;
int big_num;
bigger = m[(unsigned)(a-b)>>(sizeof(int)-1)];//unsigned不能省略


yaya_lucky 2012-08-20
  • 打赏
  • 举报
回复
mark
左眼看到鬼 2012-06-22
  • 打赏
  • 举报
回复
老帖子了,但是还是得学习下
tiantiant1 2012-06-21
  • 打赏
  • 举报
回复
学习了。。。
luoyingbinfeng 2012-06-21
  • 打赏
  • 举报
回复
int a = 3, b = 4;
int m[2];
int bigger;
int c;
m[0] = a;
m[1] = b;
c=a/b;
bigger = m[c];
luoyingbinfeng 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
第三题纯粹玩笑的解答,仅供娱乐

C/C++ code

int a = 1;
int b = 2;
while(a < b) return b;
return a;
[/Quote]
有可能会死循环
qzef177 2012-05-09
  • 打赏
  • 举报
回复
貌似第三题,用X和+的都要考虑越界的~~!
jemofh159 2012-04-21
  • 打赏
  • 举报
回复
mark
liulefirst 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

第二题确实写错了
C/C++ code
int func(int i,int n)
{
return (i<n && printf("%d\n",i)) && !func(i+1,n) || printf("%d\n",i);
}




第一次见到printf()放在return里,怎么还能做为条件来判断?
[/Quote]printf函数返回输出字符的个数。当然可以作为判断条件
ikernel32 2012-04-17
  • 打赏
  • 举报
回复
留着晚上回家看
goldbeef 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

2, !p(i+1,n) 应该是 !func(i+1 ,n)
如果 i >= n,则输出i的值。
如果 i < n,则输出
i
i+1
...
n
n-1
n-2
...
i
[/Quote]++
Ever_lover 2012-04-05
  • 打赏
  • 举报
回复
mark 学习之
34栋610 2012-04-04
  • 打赏
  • 举报
回复
!!!!!!!!!!!!!!!!!
sheldenwade1 2012-04-04
  • 打赏
  • 举报
回复
本身abs函数内部就使用了大小比较,所以肯定不行了
[Quote=引用 1 楼 的回复:]

第三题
C/C++ code

int a = 3;
int b = 4;
((a + b) + abs(a - b))/2;

((a + b) + abs(a - b))/2
[/Quote]
别逗我乐 2011-10-25
  • 打赏
  • 举报
回复
mark
加载更多回复(270)

69,394

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧