CSP 2023 入门级第一轮 CSP-J 2023初试题 完善程序第一题解析

三、完善程序(单选题,每小题 3 分,共计 30 分)

一、题目阅读

(寻找被移除的元素)问题: 原有长度为 n+1 公差为 1 等差数列,将数列输到程序的数组时移除了一个元素,导致长度为 n 的连续数组可能不再连续,除非被移除的是第一个或最后一个元素。需要在数组不连续时,找出被移除的元素。试补全程序。

#include <iostream>
#include <vector>
using namespace std;
int find_missing(vector<int>& nums) {
    int left = 0, right = nums.size() - 1;
    while (left < right){
        int mid = left + (right - left) / 2;
        if (nums[mid] == mid + ①) {
            ②;
        } else {
            ③;
        }
    }
    return ④;
}
int main() {
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; i++) cin >> nums[i];
    int missing_number = find_missing(nums);
    if (missing_number == ⑤) {
        cout << "Sequence is consecutive" << endl;
    }else{
        cout << "Missing number is " << missing_number << endl;
    }
    return 0;
}

二、程序分析

既然题目已经告诉我们要做的了,那我们不妨用二分模拟一下找出被移除元素的过程。

nums = {3, 4, 5, 7, 8}

我们第一次找到num[2] = 5,这时怎么判断在要找的位置的左边还是右边呢?我们知道,这个序列的第一个元素不固定,所以不能直接拿下标去判断。不过我们可以获取第一个元素,3,按理来说等差数列的第n个的值就是首项 + 公差 * (n - 1),所以此处可以算出来本应是

3 + 2 * 1 = 5,而5 == 5,所以往后面找。

第二次,找到7,3 + 3 * 1 = 6,所以锁定在这个位置了。现在结合文中部分代码,

right应该 = 7的位置,不可以小于7,这样就定了第三题的答案。

然后循环条件不满足,跳了出来。

然后可以根据当前下标与第一个数推算出结果。

三、题目分析

1. ①处应填(B)

A. 1

B. nums[0]
C. right
D. left

【计算等差数列中一个位置的数值,必然跟第一个数的值有关】】

2. ②处应填(A)

 A. left=mid+1

 B. right=mid-1
 C. right=mid
 D. left=mid

【当该数值正确时,结合第4题理解,到最后(left==right)left指向缺少的值的后面一个下标,说明这不可能是缺少的后一个,应把空间往右缩进,同时+1】

3. ③处应填(C)

A. left=mid+1

B. right=mid-1
C. right=mid
D. left=mid

【发现数值不符合等差数列的要求,要把空间往左缩进,但不能减一,应为不排除它是缺少的数的下一个下标的可能】

4. ④处应填(A或者B)

A. left+nums[0]

B. right+nums[0]
C. mid+nums[0]
D. right+1

【本题有问题,出循环时left == right,所以AB都行,但是比赛时遇到应选A,因为A为常规做法】
5. ⑤处应填(D)

A. nums[0]+n

B.  nums[0]+n-1
C.  nums[0]+n+1
D.  nums[n-1]

【当该数组为等差数列时,left不断往右移动,最终与right(n - 1)重合而止,所以应该与最后一个数字做比较】

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2023 csp-j入门级第一轮试题是中国计算机科学会议(CSP)针对学者设计的一道。根据目的具体要求,试题内容可能涉及算法、编程语言、数据结构等方面的知识。 对于这样的试题,学生们需要运用自己所学的知识和技能,通过编程实现目要求。例如,可能需要设计一个算法来解决一个具体的问题,或者使用特定的数据结构来组织和处理数据。 为了完成这样的试题,学生们首先需要理解目的要求和限制条件,确保对目中涉及的概念和术语有所了解。接下来,他们需要分析问题,确定解决问题的方法和步骤。在实际编程实现时,可以选择合适的编程语言和工具,并按照目要求进行编码。 在完成编码后,学生们需要进行测试和调试,确保程序能够正确运行并得到正确的结果。在测试过程中,可以使用一些已知的测试用例来验证程序的正确性,并对程序进行优化,以提高其性能。 最后,将代码提交,并等待评审结果。评审过程可能涉及代码质量、算法复杂度、正确性等方面的考量。根据评审结果,学生们可以了解自己的编程水平和不足之处,并进行相应的学习和提高。 总体来说,解答2023 csp-j入门级第一轮试题需要学生在编程基础上运用算法数据结构的知识,进行问题的分析和解决。通过这样的学习和实践,学生们可以提高自己的编程能力,并逐渐成长为优秀的程序员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值