#G1177. 客观题

客观题

一、单选题(每题 2 分,共 30 分)

  1. 小杨家响应国家以旧换新政策,将自家的汽油车置换为新能源汽车,正在准备自编车牌。自编车牌包括 55 位数字或英文字母,要求第 55 位必须是数字,前 44 位中可以有最多 11 位英文字母。英文字母必须是大写,而且不能是 O\tt OI\tt I(因为容易与数字 0011 混淆)。请问自编车牌共有多少种可能性?( )

{{ select(1) }}

  • 100,000100,000
  • 1,060,0001,060,000
  • 1,360,0001,360,000
  • 1,460,0001,460,000
  1. 新年到,四家人在一起聚会。其中两家有三口人,另外两家有两口人。现在要安排大家在一张十人圆桌坐下,要求一家人必须相邻就座。由于有主座的习俗,每个座位都被认为是不同的。请问共有多少种就座方案?( )

{{ select(2) }}

  • 86408640
  • 69126912
  • 144144
  • 6060
  1. 下面关于 C\tt C++ 类继承的说法,错误的是( )。

{{ select(3) }}

  • 一个类可以继承多个类
  • 一个类可以被多个类继承
  • 一个类可以继承另一个类的子类
  • 抽象类必须被至少一个类继承,否则会编译错误
  1. 使用邻接表表达一个简单有向图,图中包含 vv 个顶点、ee 条边,则该出边表中边节点的个数为( )。

{{ select(4) }}

  • v×(v1)v\times (v-1)
  • v×vv\times v
  • 2×e2\times e
  • ee
  1. 以下将二维数组作为参数的函数声明,哪个是符合语法的?( )

{{ select(5) }}

  • void Bubble(int a[10][], int m);
  • void Bubble(int a[][], int n, int m);
  • void Bubble(int (*a)[20], int n);
  • void Bubble(int * a[20], int n);
  1. 已知两个点 AABB 在平面直角坐标系下的坐标分别为和,并分别定义变量 double xa, ya, xb, yb; 存储坐标。假设直线 ABAB 的斜率存在,下列哪个表达式可以用来表达它?( )

{{ select(6) }}

  • (xa - xb) / (ya - yb)
  • (xa - xb) / (yb - ya)
  • (ya - yb) / (xa - xb)
  • (ya - yb) / (xb - xa)
  1. 二项式 (x+y)6(x+y)^6 的展开式中 x3y3x^3y^3 项的系数是( )。

{{ select(7) }}

  • 66
  • 1515
  • 2020
  • 120120
  1. 以下关于动态规划的说法中,错误的是( )。

{{ select(8) }}

  • 动态规划方法有递推和递归两种实现形式
  • 递归实现动态规划方法的时间复杂度总是不低于递推实现
  • 动态规划方法将原问题分解为一个或多个相似的子问题
  • 动态规划方法通常能够列出递推公式
  1. 在下面的程序中,使用整数表示一种组合。整数二进制表示的某一位为 11,表示该位对应的数被选中,反之为 00 表示未选中。例如,从 050 \sim 566 个数中选出 33 个,则 0b1110000b111000 代表选中 3,4,53, 4, 5 三个数,0b0110010b011001 代表选中 0,3,40, 3, 4 三个数。zuhe_next\tt zuhe\_next 函数按组合对应的整数由大到小的顺序,求出组合 cc 的下一个组合。横线处可以填入的是( )。

    int intlow2(int c) {
        return ________; // 在此处填入选项
    }
    int zuhe_next_incur(int c, int n, int l) {
        if (n == 1) return c;
        if ((c & (1 << l)) == 0) {
            int d = intlow2(c);
            c = (c & ~d);
            c = (c | (d >> 1));
        } else {
            c = (c & ~(1 << l));
            c = zuhe_next_incur(c, n - 1, l + 1);
            int d = intlow2(c);
            c = (c | (d >> 1));
        }
        return c;
    }
    // 从n个数中选m个,当前组合为c
    int zuhe_next(int c, int n, int m) {
        return zuhe_next_incur(c, n, 0);
    }
    

{{ select(9) }}

  • ((c - 1) ^ c)
  • (((c - 1) ^ c) + 1)
  • (((c - 1) ^ c) >> 1)
  • ((((c - 1) ^ c) + 1) >> 1)
  1. 下面程序的输出为( )。

    #include <iostream>
    using namespace std;
    int main() {
        int N = 15, cnt = 0;
        for (int x = 0; x + x + x <= N; x++)
            for (int y = x; x + y + y <= N; y++)
                for (int z = y; x + y + z <= N; z++)
                    cnt++;
        cout << cnt << endl;
        return 0;
    }
    

{{ select(10) }}

  • 174174
  • 447447
  • 816816
  • 40964096
  1. 下面最长公共子序列程序中,横线处应该填入的是( )。

    #define MAX(A, B) (((A) > (B)) ? (A) : (B))
    #define MIN(A, B) (((A) < (B)) ? (A) : (B))
    int dp[MAX_L + 1][MAX_L + 1];
    int LCS(char str1[], char str2[]) {
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        for (int i = 0; i < len1; i++)
            for(int j = 0; j < len2; j++)
                if (str1[i] == str2[j])
                    dp[i + 1][j + 1] = dp[i][j] + 1;
                else
                    ________; // 在此处填入选项
        return dp[len1][len2];
    }
    

{{ select(11) }}

  • dp[i + 1][j + 1] = dp[i][j + 1] + dp[i + 1][j]
  • dp[i + 1][j + 1] = MIN(dp[i][j + 1], dp[i + 1][j])
  • dp[i + 1][j + 1] = MAX(dp[i][j + 1], dp[i + 1][j])
  • dp[i + 1][j + 1] = MAX(dp[i][j + 1], dp[i + 1][j]) + 1
  1. 下列 Dijkstra\tt Dijkstra 算法中,横线处应该填入的是( )。

    typedef struct Edge {
        int in, out; // 从下标in顶点到下标out顶点的边
        int len; // 边长度
        struct Edge * next;
    } Edge;
    // v:顶点个数,graph:出边邻接表,start:起点下标,dis:输出每个顶点的最短距离
    void dijkstra(int v, Edge * graph[], int start, int * dis) {
        const int MAX_DIS = 0x7fffff;
        for (int i = 0; i < v; i++)
            dis[i] = MAX_DIS;
        dis[start] = 0;
        int * visited = new int[v];
        for (int i = 0; i < v; i++)
            visited[i] = 0;
        visited[start] = 1;
        for (int t = 0; ; t++) {
            int min = MAX_DIS, minv = -1;
            for (int i = 0; i < v; i++) {
                if (visited[i] == 0 && min > dis[i]) {
                    min = dis[i];
                    minv = i;
                }
            }
            if (minv < 0)
                break;
            visited[minv] = 1;
            for (Edge * e = graph[minv]; e != NULL; e = e->next) {
                ________; // 在此处填入选项
            }
        }
        delete[] visited;
    }
    

{{ select(12) }}

  • if (dis[e->out] > e->len)
        dis[e->out] = e->len;
    
  • if (dis[e->out] > min + e->len)
        dis[e->out] = min + e->len;
    
  • if (dis[e->in] > e->len)
        dis[e->in] = e->len;
    
  • if (dis[e->in] > min + e->len)
        dis[e->in] = min + e->len;
    
  1. 假设图 graph\tt graph 中顶点数 vv、边数 ee,上题程序的时间复杂度为( )。

{{ select(13) }}

  • O(e)O(e)
  • O(v2)O(v^2)
  • O(vlogv+e)O(v\log v + e)
  • O((v+e)logv)O((v+e)\log v)
  1. 下面的快速排序程序中,两处横线处分别应填入的是( )。

    void quick_sort(int a[], int n) {
        if (n <= 1)
            return;
        int pivot = 0, l = 0, r = n - 1;
        while (________) { // 在此处填入选项
            while (r > pivot && a[r] >= a[pivot])
                r--;
            if (r > pivot) {
                int temp = a[pivot];
                a[pivot] = a[r];
                a[r] = temp;
                pivot = r;
            }
            while (l < pivot && a[l] <= a[pivot])
                l++;
            if (l < pivot) {
                int temp = a[pivot];
                a[pivot] = a[l];
                a[l] = temp;
                pivot = l;
            }
        }
        quick_sort(a, pivot);
        quick_sort(________); // 在此处填入选项
    }
    

{{ select(14) }}

  • l < r
    a + pivot + 1, n - pivot - 1
    
  • l < r
    a + pivot + 1, n - pivot
    
  • l <= r
    a + pivot + 1, n - pivot - 1
    
  • l <= r
    a + pivot + 1, n - pivot
    
  1. 上题程序的时间复杂度为( )。

{{ select(15) }}

  • O(n)O(n)
  • O(n2)O(n^2)
  • O(2n)O(2^n)
  • O(nlogn)O(n\log n)

二、判断题(每题 2 分,共 20 分)

  1. 表达式 '3' + '5' 的结果为 '8',类型为 char\tt char。( )

{{ select(16) }}

  • 正确
  • 错误
  1. C\tt C++ 语言中,可以在函数内定义结构体,但该结构体类型只能在该函数内使用。( )

{{ select(17) }}

  • 正确
  • 错误
  1. nn 个元素的数组进行排序,快速排序和归并排序的平均时间复杂度都为 O(nlogn)O(n\log n)。但快速排序存在退化情况,使得时间复杂度升高至 O(n2)O(n^2);归并排序需要额外的空间开销。( )

{{ select(18) }}

  • 正确
  • 错误
  1. 二维数组的最后一维在内存中一定是连续的,但第一维在内存中可能不连续。( )

{{ select(19) }}

  • 正确
  • 错误
  1. 使用 math.hcmath 头文件中的函数,表达式 log(1000) 的结果类型为 double、值约为 33。( )

{{ select(20) }}

  • 正确
  • 错误
  1. 你有三种硬币,分别面值 22 元、55 元和 77 元,每种硬币都有足够多。买一本书需要 2727 元,则有 88 种硬币组合(组合与顺序无关,“1122+1+155+1+122 元” 与 “1155+2+222 元” 认为是同样的组合)可以正好付清,且不需要对方找钱。( )

{{ select(21) }}

  • 正确
  • 错误
  1. 使用哈希函数 f(x)=x%pf(x) = x \% p 建立键值为 int\tt int 类型的哈希表,只要 pp 取小于等于哈希表大小的素数,可保证不发生碰撞。( )

{{ select(22) }}

  • 正确
  • 错误
  1. 杨辉三角中的第 nn 行、第 mm 项,即为将二项式 (a+b)n(a+b)^n 展开后 anmbma^{n-m}b^m 项的系数。( )

{{ select(23) }}

  • 正确
  • 错误
  1. 判断图是否连通,可以通过广度优先搜索实现。( )

{{ select(24) }}

  • 正确
  • 错误
  1. 要求解一元二次方程 x2+ax+b=0x^2 + ax + b = 0,需要先判断表达式 a ^ 2 - b * 4 >= 0 是否为真。( )

{{ select(25) }}

  • 正确
  • 错误