针对中段测试的结果、新手赛的比赛情况,以及之前的课前预习、课中学习、和课后作业情况,回答如下问题:
1 目前自己学习中存在的薄弱的知识点具体有哪些?每个薄弱的知识点都是如何获知的,每个薄弱的知识点需要列举具体的例子说明。(5分)
2 从第五章函数到第七章数组的函数题和编程题(主要是在PTA)中选出至少一道你觉得比较有挑战的题(已解决且不是奇奇的题)。写出解题报告包括:(1)题目大意;(2)解题思路;(3)代码思路,比如画出流程图;(4)核心技术总结;(5)解题过程中存在的问题,以及如何得到解决的。(5分)
1、对c++一些基础理论不太熟悉,特别是导入包的问题,可能习惯了java和Python的补全和提示,对c++导入的包不熟悉,所以只能多打代码,熟悉包的名称。
2、
(1)题目大意
7-1 数组元素循环右移问题 (20 分)
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
(2)解题思路
不管右移还是左移,对于一个数组来说,都可以看做一个方向移动移动,这道题只需要要求右移M位,只需要将末尾
的M个数放到数组前头,然后前面的N-M个往后移就可以了。
(3)代码思路
#include<iostream> using namespace std; int main(){ int n ,b; cin >> n >> b; b = b%n; int a[n]; for(int i=0;i<n;i++){ cin >> a[i]; } for(int i=n-b;i<n;i++){ cout <<a[i]<<" "; } for(int i =0;i<n-b;i++){ if(i ==0){ cout<< a[i]; } else{ cout<<" "<<a[i]; } } }
这道题我只用简单的输入输出来完成,没有另建数组,这其实是不太明智的选择,但如果这是局限于这道题,为了节省空间复杂度,这种方法就足够了,但如果接下来需要这个变化之后的数组,就需要建立额外的数组来存放。
(4)核心技术总结
先输出后M位,在输出前N-M位
(5)解题过程存在的问题及解决
可能就逻辑上需要一点思考,只要明白数组移动是什么原理,就可以将左移和右移归为一类问题来求解。