2007年8月30日

题目:数据库里面有一个表如下
a(int) | b(int)
      1|       2
      3|       4
      5|       6
..................
希望根据该表生成一个新表如下
c(int)






......
要求:
1数据量很大,对效率要求比较高,希望用批处理的方式搞定
2对空间没有要求,允许创建中间表甚至是物理表

解答:
1 取出a列,加一个id列,生成中间表c1,id列为1开头步长为2的整数,也就是1 3 5 7......

2 同样取出b列,加一个id列,生成中间表c2, 2开头步长是2的整数,也就是2 4 6 8......

3 合并c1,c2为c

点评:没有太大的新意,软件开发灵感很重要吧

发表于 2007-08-30 04:38 lostpencil 阅读(3029) | 评论 (4)编辑 收藏

题目:有一个数组里面里面的元素是0和非0的整数字混排,希望进行排序后所有的0放在数组前端,所有非0数字顺序不变放在数组后端.(主要考思维吧)
要求:
1,不能增加新的缓存(也就是不能用另外的数组或者字符串等结构来存储中间结果).
2,只能用一次单循环.


分析:1,因为上述两个要求,则只能在循环到每个元素的时候就把它放到正确的位置.
   2,对于结果数组来说,有效的是非0数和其顺序,0没有意义.
   3,按照常规思维来做其实不是很好想,虽然感觉答案就在眼前但是始终不好确定,特别是在面试这种相对有点压力的情况下(考官眼巴巴的望着你,根本就不好意思想很久),换另外一个题“非0数放前面,0放后面”就简单的多了。
算法:判断当次循环的数,非0的话就移动到非零数个数的位置,然后将这个数赋0,0就不用管了。
解答:假设数组arr[length],定义一个变量a,记录当前循环所遇见的非0数的个数,
a=0;
for(i=0;i<length;i++){
  if(0!=arr[i]){
           arr[a] = arr[i];
           arr[i] = 0;
            ++a;
  }
}
这样比较简单的思维就搞定了,非0放后面的话无非就是数组的反序循环了.
点评:感觉题目难就难在很难想到要反序循环数组,紧张的情况下思维也没有这么明了,容易按常规乱试,感觉就快出来了,但是始终有点不对。
(我当时是急发汗了)

发表于 2007-08-30 04:09 lostpencil 阅读(5970) | 评论 (28)编辑 收藏