文章
36
粉丝
0
获赞
0
访问
3.8k
将第一部分(前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)
是整体反转,这会导致数组元素顺序完全颠倒,与后续操作组合无法达到循环左移效果。
登录后发布评论
暂无评论,来抢沙发