免费注册 查看新帖 |

Chinaunix

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

问两个笔试题目,请各位不吝赐教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-27 18:29 |只看该作者 |倒序浏览
struct S {
    int i;
    int * p;
};
void main()
{
    S s;
    int * p = &s.i;
    p[0] = 4;
    p[1] = 3;
    s.p = p;
    s.p[1] = 1;
    s.p[0] = 2;
}
问程序会在哪一行死掉。

这个我不是太明白,请高手指教.

int CalcMean(int i)
{   static int s, c;
    s+=i;  c++;
    return s/c;
}
求CalcMeas( CalcMeas(3) )=?

//这个,就应该等于3吧.

int calc(int a, int b)
{
    if(a >;= b)
        return (a==b)?a:b;
    else
        return a+b+calc(++a, --b);
}
求calc(1, 5)等于?

//这个是不是15啊.
--

论坛徽章:
0
2 [报告]
发表于 2004-12-27 18:31 |只看该作者

问两个笔试题目,请各位不吝赐教

还有这样一个题目,怎样做效率比较高呢?先把那个升序地改写成降序,然后再合并吗?
2.2 写一个Merge函数。把两个已排序的链表合并。两个链表一个是升序,一个是降序。

论坛徽章:
0
3 [报告]
发表于 2004-12-27 19:40 |只看该作者

问两个笔试题目,请各位不吝赐教

不知道我说的对不对,高手请指教

1,在声明结构体的那行就死掉了
      结构体类型的声明没有用typedef的话要写明struct
         正确的应该是 struct S s;

2,3

3,15

4,降序的可以从末尾开始归并,操作和两个都是升序的是一样的!

论坛徽章:
0
4 [报告]
发表于 2004-12-27 19:57 |只看该作者

问两个笔试题目,请各位不吝赐教

1.q没有赋值,那里应该会死
2.3

论坛徽章:
0
5 [报告]
发表于 2004-12-27 20:35 |只看该作者

问两个笔试题目,请各位不吝赐教

应该是单向链表吧,所以没法从尾巴开始操作.
q在哪里呢?

论坛徽章:
0
6 [报告]
发表于 2004-12-27 20:55 |只看该作者

问两个笔试题目,请各位不吝赐教

第一题我试了,死在了最后一行,原因是access violation. 为什么第二个指针指向第一个整数变量时修改它的值会出错呢?请大侠指点

论坛徽章:
0
7 [报告]
发表于 2004-12-27 21:24 |只看该作者

问两个笔试题目,请各位不吝赐教

如果编译器没有优化,并且指针是占用4个字节的话。第一题应该是最后一行出问题。

论坛徽章:
0
8 [报告]
发表于 2004-12-27 22:46 |只看该作者

问两个笔试题目,请各位不吝赐教

第一题s.p[1]指向的其实是结构体s的p指针的低16位,把它改成1了,当然是“强奸访问”了。

论坛徽章:
0
9 [报告]
发表于 2004-12-28 10:36 |只看该作者

问两个笔试题目,请各位不吝赐教

第一题在最后一行死掉

考虑内存中的情况

s{
int i ;
int* p ;
}

假设i的地址为addr1,p的地址为addr2

执行过程如下

  1. void main()
  2. {
  3.         S s;                                 /**/
  4.         int * p = &s.i;     /*        p = addr1                */
  5.                                  
  6.         p[0] = 4;           /*        addr1: 00 04        */
  7.                             /*        addr2: ?? ??        */
  8.                                      
  9.         p[1] = 3;           /*        addr1: 00 04        */
  10.                             /*        addr2: 00 03        */
  11.                                      
  12.         s.p = p;            /*        addr1: 00 04        */
  13.                             /*        addr2: addr1        */
  14.                                      
  15.         s.p[1] = 1;         /*        addr1: 00 04        */
  16.                             /*        addr2: 00 01        */
  17.         s.p[0] = 2;         /*        !! s.p == 00 01        !!!*/
  18.        
  19. }
复制代码


可以看到在倒数第二行s.p的值变成了0x0001.这显然已经在本进程的进程空间以外了.所以在最后一行访问0x0001就会报告错误.

第二题结果不可预见?i和c都没有初始化嘛.

第三题慢慢代进去算就OK了.

论坛徽章:
0
10 [报告]
发表于 2004-12-28 13:09 |只看该作者

问两个笔试题目,请各位不吝赐教

原帖由 "sunnysusan" 发表:
还有这样一个题目,怎样做效率比较高呢?先把那个升序地改写成降序,然后再合并吗?
2.2 写一个Merge函数。把两个已排序的链表合并。两个链表一个是升序,一个是降序。


如果是单链表只能将其中一个反一下然后再合并了.
还没想出其他好办法.

不过时间复杂度O(n)已经可以接受了吧.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP