文章
50
粉丝
0
获赞
0
访问
2.4k
(1)新建一个数组原来保存结果,让i赋值为p,逐渐将数值赋予新的数组,i每次加一并模n,进行n次完成左移
(2)
int arr1[n]; //初始的数组
int arr2[n];//赋值后的数组
int i=p;
for(int j=0;j<n;j++){
att2[j]=arr1[i%n];
i=i+1;
}
(3)时间复杂度是O(n)空间复杂度是O(n)创建了长度为n的数组
评分及理由
(1)得分及理由(满分4分)
学生给出的基本设计思想是:通过新建一个数组,从原数组的第p个位置开始依次取元素放入新数组,通过模n运算实现循环左移。这种方法在思路上是正确的,能够实现循环左移的功能。然而,题目要求“在时间和空间两方面都尽可能高效”,而这种方法需要O(n)的额外空间,不如标准答案中的逆置方法(空间复杂度O(1))高效。但题目并未强制要求空间复杂度必须为O(1),且学生的思路正确,因此不扣分。但考虑到标准答案中提供了更优解(空间复杂度O(1)),而学生的方法空间复杂度较高,因此酌情扣1分。得3分。
(2)得分及理由(满分7分)
学生用代码描述了其设计思想,但存在以下问题:
1. 代码中使用了变量n来定义数组长度(int arr1[n];),这在C语言中是不标准的(除非n是常量或使用动态分配),但如果是C99或C++则允许变长数组,因此不扣分。
2. 代码中数组名拼写错误:att2[j]应为arr2[j],这是一个逻辑错误,会导致程序无法正确运行,扣2分。
3. 代码未给出完整的函数形式,且未处理参数(如原数组R、左移位数p等),但核心逻辑正确。扣1分。
4. 代码注释缺失,但题目要求“关键之处给出注释”,学生未提供任何注释,扣1分。
因此,代码部分得分:7 - 2(逻辑错误) - 1(不完整) - 1(无注释) = 3分。
(3)得分及理由(满分2分)
学生正确分析了时间复杂度O(n)和空间复杂度O(n),与标准答案中的“另解”(借助辅助数组)一致,因此得2分。
题目总分:3+3+2=8分
登录后发布评论
暂无评论,来抢沙发