文章

36

粉丝

0

获赞

0

访问

3.8k

头像
2010年计算机学科专业基础综合试题 - 第42题回答
数据结构
发布于2025年9月18日 14:34
阅读数 96

将第一部分(前n-k个元素)逆序,第二部分(后k个元素)逆转变成,拼接在一起,再将刚拼接的整个部分逆转

示例:将第一部分```6 1 9```逆序变成```9 1 6```,第二部分```4 5 2 7```逆转变成```7 2 5 4```,拼接在一起成为```9 1 6 7 2 5 4```,再将整个部分逆转```4 5 2 7 6 1 9```

void reverse(int* start, int* end){
    int temp;
    while ((start < end)){
        temp = *start;
        *start = *end;
        *end = temp;    // 交换功能
        start++;
        end--;
    }
}

// 循环左转移数组R中的元素P个位置
void rotateLeft(int* R, int n, int p){
    reverse(R, R+n-1);  // 整个数组反转
    reverse(R, R+n-p-1);    // 反转前P个元素
    reverse(R+n-p, R+n-1);  // 反转剩余的n-P个元素
}

时间复杂度T = O(n)

空间复杂度S = O(1)


评分及理由

(1)得分及理由(满分4分)

学生给出的基本设计思想是:先整个数组反转,然后反转前n-p个元素,最后反转剩余p个元素。这与标准答案的三次反转方法思路一致,但顺序不同。标准答案是先反转前p个,再反转后n-p个,最后整体反转;而学生是先整体反转,再反转前n-p个,最后反转剩余p个。虽然顺序不同,但数学上等价,都能达到循环左移的效果。因此思路正确,不扣分。得4分。

(2)得分及理由(满分7分)

学生代码实现存在逻辑错误:

  • rotateLeft函数中,第一次调用reverse(R, R+n-1)是整体反转,这会导致数组元素顺序完全颠倒,与后续操作组合无法达到循环左移效果。
  • 标准答案的三次反转顺序是:反转前p个、反转后n-p个、整体反转。学生代码的顺序错误,导致结果不正确。
  • 具体来说,对于示例数组(假设为[6,1,9,4,5,2,7])左...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发