社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 2609阅读
  • 0回复

[笔试]2007Google笔试题来自浙江大学BBS

t_y
级别: 经院硕士
发帖
2080
铜板
4671
人品值
2716
贡献值
3
交易币
0
好评度
2087
信誉值
0
金币
0
所在楼道
一、单选

1、80x86中,十进制数-3用16位二进制数表示为?

2、假定符号-、*、$分别代表减法、乘法和指数运算,且

1)三个运算符优先级顺序是:-最高,*其次,$最低;

2)运算符运算时为左结合。请计算3-2*4$1*2$3的值:

(A)4096,(B)-61,(C)64,(D)-80,(E)512

3、下列伪代码中,参数是引用传递,结果是?

calc(double p, double q, double r){q=q-1.0;r=r+p}
main(){
  double a = 2.5, b = 9.0;
  calc(b-a, a, a);
  print(a);
}
(A)1.5 (B)2.5 (C)10.5 (D)8 (E)6.5

4、求输出结果:

int foo(int x, int y){
  if(x <=0 || y <= 0) return 1;
  return 3 * foo(x - 1, y / 2);
}
printf("%d\n", foo(3, 5));
(A)81 (B)27 (C)9 (D)3 (E)1

5、下列哪个数据结构在优先队列中被最广泛使用?

(A)堆 (B)数组 (C)双向链表 (D)图 (E)向量

6、以下算法描述了一个在n国元素的双向链表中找到第k个元素的方法(k >= 1且k <= n):

如果k <= n - k,从链表开始往前进k-1个元素。

否则,从终点出发,往回走n - k个元素。

这个算法的时间代价是?

(A)θ(nlogn) (B)θ(max{k, n - k}) (C)θ(k + (n - k))

(D)θ(max{k, k - n}) (E)θ(min{k, n - k})

7、有一个由10个顶点组成的图,每个顶点有6个度,那么这个图有几条边?

(A)60 (B)30 (C)20 (D)80 (E)90

8、正则表达式L = x*(x|yx+)。下列哪个字符串不符合L

(A)x (B)xyxyx (C)xyx (D)yxx (E)yx

9、为读取一块数据而准备磁盘驱动器的总时间包括

(A)等待时间 (B)寻道时间 (C)传输时间 (D)等待时间加寻道时间

(E)等待时间加寻道时间加传输时间

二、算法

1、打印出一个二叉树的内容。

2、在一个字符串中找到第一个只出现一次的字符。如abaccdeff,输出b。

3、给定一个长度为N的整数数组(元素有正有负),求所有元素之和,最大的一个子数组。分析算法时空复杂度。不必写代码。


附上动态规划做法的答案:

最大子序列

问题:

给定一整数序列A1, A2,... An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大

例如:整数序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和为21。对于这个问题,最简单也是最容易想到的那就是穷举所有子序列的方法。利用三重循环,依次求出所有子序列的和然后取最大的那个。当然算法复杂度会达到O (n^3)。显然这种方法不是最优的,下面给出一个算法复杂度为O(n)的线性算法实现,算法的来源于Programming Pearls一书。在给出线性算法之前,先来看一个对穷举算法进行优化的算法,它的算法复杂度为O(n^2)。其实这个算法只是对对穷举算法稍微做了一些修改:其实子序列的和我们并不需要每次都重新计算一遍。假设Sum(i, j)是A ... A[j]的和,那么Sum(i, j+1) = Sum(i, j) + A[j+1]。利用这一个递推,我们就可以得到下面这个算法:

int max_sub(int a[],int size)
{
  int i,j,v,max=a[0];
  for(i=0;i<size;i++)
  {
    v=0;
    for(j=i;j<size;j++)
    {
      v=v+a[j];//Sum(i, j+1) = Sum(i, j) + A[j+1]
        if(v>max)
         max=v;
    }
  }
  return max;
}

那怎样才能达到线性复杂度呢?这里运用动态规划的思想。先看一下源代码实现:
int max_sub2(int a[], int size)
{
  int i,max=0,temp_sum=0;
  for(i=0;i<size;i++)
  {
      temp_sum+=a;
      if(temp_sum>max)
        max=temp_sum;
      else if(temp_sum<0)
        temp_sum=0;
  }
  return max;
}

在这一遍扫描数组当中,从左到右记录当前子序列的和temp_sum,若这个和不断增加,那么最大子序列的和max也不断增加(不断更新 max)。如果往前扫描中遇到负数,那么当前子序列的和将会减小。此时temp_sum 将会小于max,当然max也就不更新。如果temp_sum降到0时,说明前面已经扫描的那一段就可以抛弃了,这时将temp_sum置为0。然后, temp_sum将从后面开始将这个子段进行分析,若有比当前max大的子段,继续更新max。这样一趟扫描结果也就出来了。 
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
描述
快速回复

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
10+5=?,请输入中文答案:十五