📜  数据结构和算法 | 31套

📅  最后修改于: 2021-09-28 09:32:46             🧑  作者: Mango

以下问题已在 GATE CS 2013 考试中提出。

1)如果调用前p的值被初始化为5,f(p,p)的返回值是多少?请注意,第一个参数是通过引用传递的,而第二个参数是通过值传递的。

int f(int &x, int c) {
   c  = c - 1;
   if (c == 0) return 1;
   x = x + 1;
   return f(x, c) * x;
} 

(一) 3024
(乙) 6561
(三) 55440
(四) 161051

答案 (B)
由于 c 是按值传递而 x 是按引用传递,因此所有函数都将具有 x 的相同副本,但 c 的副本不同。

f(5, 5) = f(x, 4)*x = f(x, 3)*x*x = f(x, 2)*x*x*x = f(x, 1)*x*x *x*x = 1*x*x*x*x = x^4

由于 x 在每次函数调用中都会递增,因此在调用 f(x, 2) 后它变为 9。所以表达式 x^4 的值变成了 9^4,也就是 6561。

#include 
  
int f(int &x, int c)
{
    c  = c - 1;
    if (c == 0) return 1;
    x = x + 1;
    return f(x, c) * x;
}
int main()
{
    int p = 5;
    printf("%d", f(p, p));
}

1) 一棵二叉搜索树的前序遍历序列是30, 20, 10, 15, 25, 23, 39, 35, 42. 以下哪一个是同一棵树的后序遍历序列?
(一) 10, 20, 15, 23, 25, 35, 42, 39, 30
(乙) 15, 10, 25, 23, 20, 42, 35, 39, 30
(C) 15、20、10、23、25、42、35、39、30
(四) 15, 10, 23, 25, 20, 35, 42, 39, 30

答案 (D)
下面是构建的树

30
         /      \
        20       39 
       /  \     /  \
     10    25  35  42  
      \   /
      15 23

3) 考虑以下函数

int unknown(int n) {
    int i, j, k = 0;
    for (i  = n/2; i <= n; i++)
        for (j = 2; j <= n; j = j * 2)
            k = k + n/2;
    return k;
 }

上面函数的返回值是多少?
(A) Θ(n^2)
(B) Θ(n^2Logn)
(C) Θ(n^3)
(D) Θ(n^3Logn)

答案 (B)
外循环运行 n/2 或 Θ(n) 次。内部循环运行 Θ(Logn) 次(请注意,j 在每次迭代中除以 2)。所以语句“k = k + n/2;”运行 Θ(nLogn) 次。该语句将 k 的值增加 n/2。所以 k 的值变成 n/2*Θ(nLogn) 也就是 Θ(n^2Logn)

4) 使用堆排序可以在 Θ(logn) 时间内排序的元素数量是
(A) Θ(1)
(B) Θ(sqrt(logn))
(C) Θ(Log n/(Log Log n))
(d) Θ(Log n)

答案 (C)
对于 m 个输入元素,堆排序的时间复杂度为 Θ(mLogm)。对于 m = Θ(Log n/(Log Log n)),Θ(m * Logm) 的值将是 Θ( [Log n/(Log Log n)] * [Log (Log n/(Log Log n)) )] ) 将是 Θ( [Log n/(Log Log n)] * [ Log Log n – Log Log Log n] ) 是 Θ(Log n)

5)要求以下给出的过程来查找和替换某些字符在阵列A供给到被替换阵列oldc供给的字符的输入内,而它们各自的替换字符以阵列NEWC供给。数组 A 的固定长度为 5 个字符,而数组 oldc 和 newc 各包含三个字符。然而,程序有缺陷

void find_and_replace(char *A, char *oldc, char *newc) {
    for (int i = 0; i < 5; i++)
       for (int j = 0; j < 3; j++)
           if (A[i] == oldc[j]) A[i] = newc[j];
}

该程序使用以下四个测试用例进行测试
(1) oldc = “abc”, newc = “dab”
(2) oldc = “cde”, newc = “bcd”
(3) oldc = “bca”, newc = “cda”
(4) oldc = “abc”, newc = “bac”
测试器现在在所有长度为 5 的输入字符串上测试程序,这些字符串由字符’a’、’b’、’c’、’d’ 和 ‘e’ 组成,并且允许重复。如果测试人员用上面给出的四个测试用例进行这个测试,有多少测试用例能够捕捉到缺陷?

(一) 只有一个
(B) 只有两个
(C) 只有三个
(D) 所有四个

答案 (B)
测试用例 3 和 4 是唯一捕获缺陷的用例。当旧字符被新字符替换并且新字符再次被另一个新字符替换时,代码无法正常工作。这不会发生在测试用例 (1) 和 (2) 中,它只发生在用例 (3) 和 (4) 中。

6) 如果让数组 A 保存字符串“abcde”,上述四个测试用例中的哪一个将成功暴露该程序中的缺陷?
(A) 无
(B) 仅 2 个
(C) 仅 3 和 4
(D) 仅 4 个

答案 (C)

#include 
#include 
  
void find_and_replace(char *A, char *oldc, char *newc) {
    for (int i = 0; i < 5; i++)
       for (int j = 0; j < 3; j++)
           if (A[i] == oldc[j]) A[i] = newc[j];
}
  
int main()
{
    char *oldc1 = "abc", *newc1 = "dab";
    char *oldc2 = "cde", *newc2 = "bcd";
    char *oldc3 = "bca", *newc3 = "cda";
    char *oldc4 = "abc", *newc4 = "bac";
  
    char test[] =  "abcde";
  
    printf("Test 2\n");
    printf("%s\n", test);
    find_and_replace(test, oldc2, newc2);
    printf ("%s\n", test);
  
    printf("\nTest 3\n");
    strcpy(test, "abcde");
    printf("%s\n", test);
    find_and_replace(test, oldc3, newc3);
    printf ("%s\n", test);
  
    printf("\nTest 4\n");
    strcpy(test, "abcde");
    printf("%s\n", test);
    find_and_replace(test, oldc4, newc4);
    printf ("%s\n", test);
}

输出:

Test 2
abcde
abbcd

Test 3
abcde
addde

Test 4
abcde
aacde

请参阅 GATE Corner 了解所有往年论文/解决方案/解释、教学大纲、重要日期、笔记等。