Problem A: [CSP-S1][程序阅读] 程序阅读6

Memory Limit:128 MB Time Limit:1.000 S
Judge Style:Text Compare Creator:
Submit:71 Solved:8

Description

int findLast(int a[], int n, int x) {
    int l = 0, r = n; // n为数组长度
    while (l < r) {
        int mid = (l + r) / 2;
        if (a[mid] <= x) l = mid + 1;
        else r = mid;
    }
    return l - 1;
}

判断题(正确填√,错误填×)
1. 当数组中存在x时,函数返回x最后一次出现的下标。( )
2. 若x大于数组所有元素,函数返回n-1。( )
3. 循环不变式为`a[l-1] ≤ x < a[r]`。( )
4. 若x小于数组所有元素,函数返回-1。( )
5. 当`a[mid] == x`时,仍需继续向右半部分查找。( )

选择题
6. 数组`[1,2,2,3,4]`查找x=2时,返回值是:
    A. 1  B. 2  C. 3  D. -1

7. 若将`a[mid] <= x`改为`a[mid] < x`,函数将返回:
    A. 最后一个≥x的元素下标  

    B. 最后一个>x的元素下标  
    C. 第一个≥x的元素下标 

    D. 第一个>x的元素下标

8. 当`n=0`时,函数返回值是:
   A. -1  B. 0  C. 1  D. 未定义

9. 循环结束时,`l`和`r`的关系是:
   A. l = r  B. l = r - 1  C. l = r + 1  D. l > r

10. 若数组降序排列,需如何修改代码?
    A. 交换`l=mid+1`和`r=mid`的条件  

    B. 将`a[mid]<=x`改为`a[mid]>=x`  
    C. 无需修改  

    D. 无法实现