2012-9-26 金山WPS笔试题

今晚的笔试题目不难,所考算法也不是很难,关键在仔细审题和平常的积累……

1. 有770个节点的完全二叉树,问叶子节点有多少?(重点是叶子节点,不是最下一层的节点数目,陷阱呀)

可以计算得出该完全二叉树的最下面一层的节点数目是259,上一层的节点数目为256,所以,可以得出上一层的叶子节点数目有126,所以结果为385


2. 已知数组a[100][65]是以行序排列,现已知其起始地址为10000,每个元素占两个字节,求a[56][22]的起始地址?(行序为陷阱)

其实这里不说行序反而没有问题,10000+(56×65 + 22 )× 2 = 17324


3. 一无序数组a,有n个元素,现问将其构造成最大堆的时间复杂度是多少(O(n))


4. (he) ^ 2 = she , 问s、h、e的值分别是什么?其实这题很容易就能想到25,25^2 = 625, 所以s的值为6, h为2, e为5


5. 有一个数组,数组里面有n多整数,现要求实现一个程序将数组中的每一个数的数值变为不包括该数的其他数的乘积。假设不会溢出,要求算法的时间复杂度和空间复杂度越低越好!

void cal(int * input, int n)
{
int tempSum = 1;
for(int i = 0; i < n; i++)
tempSum *= input[i];
for(int i = 0; i < n; i++)
input[i] = tempSum / input[i];
}

6. 有一数组,数组里面有n个整数,现已知数组中有三个数只有一个,其他的数都有两个,实现一个程序输出3个数中的任意一个,要求算法时间复杂度和空间复杂度越低越好?(一个比较差的实现,好的没想出来)

(室友想出来的思路:采用类似于快速排序的方法,在数组中任选一元素V作为支点,将大于V的元祖放在该元素的右边,小于该元素的元祖放在该元素的左边;如果左右两边的元素数目都为偶数,则表明该支点元素V就是3个唯一元素中的一个;若一边为奇数个,一边为偶数个,则选取奇数个那边递归使用上述算法即可,该算法的时间复杂度O(nlogn))

void fun(int * a, int n)
{
int i=0, j =0;
for(i = 0; i < n; i++)
{
bool second = false;
for(j = 0; j < n; j++)
{
if(a[i] == a[j]  && i != j)
{
second  = true;
break; 
}
}
if(second == false)
{
cout<<a[i]<<endl;
break;
}
}
}

6.典型的并查集问题(可惜当时没想出来具体的实现)



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页