文章
36
粉丝
0
获赞
0
访问
3.7k
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个(不变),结果正确,但这是巧合。...
登录后发布评论
暂无评论,来抢沙发