题目1:两个二进制数的异或结果
两个二进制数异或结果 是 这两个二进制数差的绝对值,即表达为如下: a^b = |a-b| (按位相减)
解答过程:
题目2:递归函数最终会结束,那么这个函数一定(不定项选择):
1. 使用了局部变量 2. 有一个分支不调用自身
3. 使用了全局变量或者使用了一个或多个参数
这是一道简单的选择题,但包含的内容并不算简单,而不定项选择更加大了难度。我一眼看去,自然就选择了2和3。
1显然不是,局部变量只在一次调用局部范围有效,出了这次调用的范围就无效了,它不能控制递归的结束。(这个选项是考查局部变量生命周期/有效范围的问题)需要注意的就是局部变量不是局部静态变量。
对于2,很自然了,如果没有一个分支不调用自身,递归就不会结束了。(这是在考查递归的定义)
对于3,这是最有迷惑性的,因为使用全局变量或使用一个或多个参数的确可以控制递归的结束,但是不是只有这两种方式呢?所以题目中指出了"一定"。答案是并不是只有这两种方式。
呵呵,所以,正确答案是2,只有这一个。
以上终止条件,我只想到前两个,后面的是综合了其他人的"创意":D
题目3:T(n) = 25T(n/5)+n^2的时间复杂度?
T(n) = 25T(n/5)+n^2 = 25(25T(n/25)+n^2/25)+n^2
= 625T(n/25)+n^2+n^2 = 625T(n/25) + 2n^2
= 25^2 * T( n/ ( 5^2 ) ) + 2 * n*n
= 625(25T(n/125)+n^2/625) + 2n^2
= 625*25*T(n/125) + 3n^2
= 25^3 * T( n/ ( 5^3 ) ) + 3 * n*n
= ....
= 25 ^ x * T( n / 5^x ) + x * n^2
T(n) = 25T(n/5)+n^2
T(0) = 25T(0) + n^2 ==> T(0) = 0
T(1) = 25T(0)+n^2 ==> T(1) = 1
x = lg 5 n
25 ^ x * T( n / 5^x ) + x * n^2
= n^2 * 1 + lg 5 n * n^2
= n^2*(lgn)
题目4:实现两个N*N矩阵的乘法,矩阵由一维数组表示
void matrix_mul(int a[][], int b[][], int c[][])
{
for(int j=0;j
{
int sum=0;
for(int i=0;i
{
for(int k=0;k
c[j][i]+=a[j][k]+b[k][i];
}
}
}
题目5:找到单向链表中间那个元素,如果有两个则取前面一个
用两个指针,一个步长为1,另一个步长为2,当步长为2的指针走到链表尾部时,步长为1的指针的指向就是中间那个元素。
题目6:长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可以用除法。要求对算法的时间复杂度和空间复杂度作出分析,不要求写程序。
令这 N 个数的乘积为 P,