文章

36

粉丝

0

获赞

0

访问

3.7k

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

1. 第一部分(前n-p个元素)逆序,第二部分(后p个元素)逆转,将这两个逆序操作后的部分拼接在一起,再将整个部分逆转

例:待排序数组6 1 9 4 5 2 7

第一部分```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```

2. 

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个元素
}

时间复杂度O(n),空间复杂度O(1)


评分及理由

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

学生描述的基本设计思想与标准答案思路一致,都是通过三次逆置操作实现循环左移。但学生描述中存在术语混淆:第一部分应为前p个元素(而非前n-p个),第二部分应为后n-p个元素(而非后p个)。不过结合示例和代码,实际意图正确。扣1分,得3分。

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

学生代码实现了三次reverse操作,但具体实现顺序与标准答案不同:学生先整体逆置,再逆置前n-p个元素,最后逆置剩余p个元素。这种顺序实际实现的是循环右移p位(等价于左移n-p位),而非直接左移p位。例如,对于数组[1,2,3,4]左移1位,应得[2,3,4,1],但该代码会先整体逆置得[4,3,2,1],再逆置前3个得[2,3,4,1],最后逆置剩余1个(不变),结果正确,但这是巧合。...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发