【单选题】(每题2分)
1、以下不属于计算机输出设备的有?( )
A、麦克风 B、音箱 C、打印机 D、显示器
正确答案:A
试题解析:麦克风是属于计算机的输入设备。
2、小明想了一个 1~100 之间的整数。你可以做多次猜测,每次猜测之后,如果你没有猜中,小明会告诉你,你猜的数比他想的数大还是小。你希望你在运气最坏的情况下花费最少的次数猜中,请问你运气最坏的情况下会猜( )次?(包括最后猜中的那次)
A、5 B、6 C、7 D、100
正确答案:C
试题解析:根据二分查找算法的思想,为了在运气最坏的情况下最少次数猜中,我们可以每次将搜索范围缩小一半。
对于N个数字,最多的猜测次数则是LogN。
本例中,因为2的6次方是64,而2的7次方128,所以最多需要7次可以猜中。
3、关于分治算法,下列说法错误的是?( )
A、分治算法的核心思想是分而治之,即把问题转化为多个规模更小的子问题求解。 B、分治算法可以不使用递归实现。
C、分治算法的时间复杂度是 O(logN),其中 N 表示问题的规模。 D、分治算法通常较容易在多核处理器上实现加速。
正确答案:C
试题解析:选项A是分治算法的核心思想,是正确的。
选项B,虽然分治算法经常用递归来实现,但也可以使用迭代或循环等方式实现。
选项C,分治算法的时间复杂度通常是 O(n log n) 或者 O(n^2),这取决于具体的问题和算法设计。只有在对半分割的情况下,时间复杂度才是 O(logN)。
选项D,因为分治算法可以将问题分解为多个子问题,并行处理这些子问题,可以在多核处理器上实现加速。
4、有关下面C++代码说法错误的是?( )
#include <iostream>
using namespace std;
int factA(int n) {
if (n <= 1)
return 1;
int ret = 1;
for (int i = 2; i <= n; ++i)
ret *= i;
return ret;
}
int factB(int n) {
return n == 1 ? 1 : n * factB(n - 1);
}
int main() {
int n;
cin >> n;
cout << factA(n)<<' '<< factB(n) << endl;
return 0;
}
A、factA()采用循环方式求n的阶乘,factB()采用递归方式求n的阶乘
B、程序执行时如果输入5,能实现求其阶乘,程序输出结果为120 120 C、任何递归程序都可以使用循环改写
D、程序执行时如果输入100,不能正确求出100的阶乘
正确答案:C
试题解析:理论上所有递归都可以用循环解决,但是大量的递归用循环实现代码复杂度较大,且易出错。
程序执行时如果输入100,结果超过int类型的表示范围,不能正确求出100的阶乘。
5、下面C++代码意在实现字符串反序的功能。关于这段代码,以下说法正确的是?( )
#include <iostream>
#include <cstring>
using namespace std;
void printSReverse(char *sIn, int len) {
if (len <= 1) {
cout << sIn[0];
} else {
cout << sIn[0];
printSReverse(sIn + 1, len - 1);
}
}
int main() {
char sIn[100] = "Hello";
printSReverse(sIn, strlen(sIn));
return 0;
}
A、这段代码可以正确实现字符串反序的功能,其输出为olleH
B、这段代码不能正确实现字符串反序的功能,其输出为Hello
C、这段代码不能正确实现字符串反序的功能,其输出为HHHHH
D、这段代码不能正确实现字符串反序的功能,其输出为ooooo
正确答案:B
试题解析:这段程序不能正确实现字符串反序,原因在于printSReverse()函数中的else部分程序是先打印sIn[0],再进行递归调用;
把cout<<sIn[0];这句移到printSReverse(sIn + 1, len - 1);则可以正确对字符串反序,这样递归函数返回的时候会依次打印反序的字符。
6、阅读下面C++实现的二分查找代码,下列说法中错误的是?( )
int binarySearch(int *arr, int l, int r, int x) {
if (r >= l) {
int mid = l + (r - l) / 2;
if (arr[mid] == x)
return mid;
else if (arr[mid] > x)
return binarySearch(arr, l, mid - 1, x);
else
return binarySearch(arr, mid + 1, r, x);
} else
return -1;
}
A、上面代码实现的二分查找,最少只需查找一次即可得到结果。
B、如果调用该函数在列表{2, 3, 4, 10, 12}中查找元素0,则它实际被调用3次。
C、如果调用该函数在列表{2, 3, 4, 10, 12}中查找元素3,则它实际被调用3次。
D、如果调用该函数在列表{2, 3, 4, 10, 12}中查找元素10,则它实际被调用3次。
正确答案:D
试题解析:选项D是错的。
因为binarySearch()中的l,r指的是数组的起始和终止下标,对于数组{2, 3, 4, 10, 12},查找元素10时:
第一次调用binarySearch时,mid=2,arr[mid]=4,比10小,继续第二次调用binarySearch(arr, 3, 4, 10),mid = l + (r - l) / 2=3,arr[mid]的值为10,已经找到元素10,返回mid;
所以实际上它被调用了2次。
7

最低0.47元/天 解锁文章
1780

被折叠的 条评论
为什么被折叠?



