Google笔试题

1、 两个二进制数的异或结果
(我的答案:还是一个二进制数呗,难道考了别的知识?)
2、 递归函数最终会结束,那么这个函数一定(不定项选择):
1. 使用了局部变量   2. 有一个分支不调用自身
3. 使用了全局变量或者使用了一个或多个参数
(我的答案:举个简单的阶乘的例子
Fun(int n)
{
   if(n>1)
      return n*Fun(n-1);
   else
     return 1;
}
肯定有一个分支使其结束继续递归,递归的函数之间肯定要传递(共享一些)信息,这些信息要么放在全局变量里面,要么通过参数传递。


3、以下函数的结果?
int cal(int x)
{
    if(x==0)
return 0;
    else
        return x+cal(x-1);
}
(我的答案:该函数有问题,若输入参数>=0, 则返回从0到该数的所有整数之和。
若输入参数<0, 则无限递归,直到耗尽栈内存,或者知道 x溢出变成整数又重新回到0)

4、 以下程序的结果?
void foo(int*a, int* b)
{
    *a = *a+*b;
    *b = *a-*b;
    *a = *a-*b;
}
(我的答案,a和b指向的值互换了)
void main()
{
    int a=1, b=2, c=3;
    foo(&a,&b);
    foo(&b,&c);
    foo(&c,&a);
    printf("%d, %d, %d", a,b,c);
}
(1,3,2)
5、下面哪项不是链表优于数组的特点?
  1. 方便删除 2. 方便插入 3. 长度可变 4. 存储空间小
(我的答案 4 链表显然增加了存储空间)
6、T(n) = 25T(n/5)+n^2的时间复杂度?
(我的答案:O(log5(N)))
7、n个顶点,m条边的全连通图,至少去掉几条边才能构成一棵树?
我的答案:m-(n-1)。
对于树而言,n的点对应n-1条边。
所以却掉 m-(n-1) = n*(n-1)/2 - n-1 = (n-1)*(n-2)/2条边。
8、正则表达式(01|10|1001|0110)*与下列哪个表达式一样?
  1.(0|1)* 2.(01|01)*   3.(01|10)*   4.(11|01)*   5.(01|1)*
我的答案:C。这又是编译原理里面的东东,1001和0110都可以用 (01|10)*开生成。所以,题目等价于(01|10)*
很明显
9、如何减少换页错误?
  1. 进程倾向于占用CPU   2. 访问局部性(locality of reference)满足进程要求
3. 进程倾向于占用I/O 4.使用基于最短剩余时间(shortest remaining time)的调度
机制 5. 减少页大小
我的答案:2
10、实现两个N*N矩阵的乘法,矩阵由一维数组表示
11、找到单向链表中间那个元素,如果有两个则取前面一个
(11、用两个指针,一个步长为1,一个步长为2,当步长2的那个指针走到头时,这个时候步 )
12、长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可以用除法。要求对算法的时间复杂度和空间复杂度作出分析,不要求写程序。
我的思路:
我理解的题目的意思是,找出n-1个数相乘,乘积最大的哪一组。
。。。
p.s:
据说由于题目比较简单,传言错2个就没戏了
发信人: DorisJackson (段誉), 信区: Job_Discuss
标 题: Re: Google2007年笔试题(上海交大)(转载)
发信站: 武汉白云黄鹤站 (2006年10月11日16:24:41 星期三), 站内信件
偶只写自己会的,大家加吧
1 0
2。2
3。(n+1)*n/2
4.1 3 2
5.4
6. O(n^2*lgn)
后面的几题在想,最后一题要不要考虑负数?
......................................
1、0
2、2,3(eg, if(n<2) return 1; else return a(n-1)+a(n-2))
  应该要使用参数满足某个条件然后退出。
3、x(x+1)/2
4、1,3,2
5、4
6、O(log5(n))
7、(n-1)(n-2)/2
8、3
9、2,4 ?
10、
void matrixmul(int a[N][N], int b[N][N], int result[N][N])
{
  memset(result, 0, sizeof(int) * N * N);
  for(int i = 0; i < N; i++)
  {
    for(int j = 0; j < N; j++)
    {
        for(int k = 0; k < N; k++)
        {
          result[j] += a[k] * b[k][j];
        }
    }
  }
}
11、用两个指针,一个步长为1,一个步长为2,当步长2的那个指针走到头时,这个时候步
长为1的那个指针刚好指着中间的那个结点。
12、
思路:定义一临时量保存当前最小的数(min),和一个保存总数的(sum),开始比较(从第
2个开始)如果有比这大的,那么乘上,如果比这小,那么乘于min,把小数放到min中。
算法复杂度为O(n)
空间复杂度为O(2)
.......................................

11
somestruct* FindMiddle(somestruct* pHead)
{
  if (pHead == NULL || pHead->next == NULL)
    return pHead;
  somestruct* p1 = pHead, p2 = pHead->next;
  while (p2 != NULL && p2->next != NULL)
  {
    //每次p1前进一位,p2前进2位
    p1 = p1->next;
    p2 = p2->next->next;
  }
  return p1;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值