总结:自己二叉树写蒙圈了,pta答案网上良莠不齐,所以我选择跟着算法笔记刷,这两天写了不少简单题,今天写了5个简单模拟题,最后的日期差值还有问题没有解决;
我们就先看日期差值这题吧,我想的是用第一个日期的总天数减去第二个日期的总天数,在牛客网上全通过了,但是在codeup上显示错误,尚未找到错误的地方;
还值得一提的是,因为我考虑到多组输入,应该需要把输入改为while...EOF,但是在vs2022中需要输入三次ctrl+z才能到eof,还没有弄清楚为什么。
先展示我的思路:
- #include<iostream>
- using namespace std;
- bool is_leap_yr(int y) {
- if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) {
- return 1;
- }
- return 0;
- }
- int sum_day(int y, int m, int d) {
- int sum = 0;
- int month[13] = {0, 31,28,31,30,31,30,31,31,30,31,30,31 };//从1月开始,下标0不算
- if (is_leap_yr(y)) {
- month[2] += 1;
- }
- sum += (y * 365 + y / 4 - y / 100 + y / 400);
- for (int i = 1; i <= m-1; i++) {//月份是1-->m-1,m不算
- sum += month[i];
- }
- return sum + d;
- }
- int main() {
- int y1, m1, d1, y2, m2, d2;
- scanf("%4d%2d%2d", &y1, &m1, &d1);
- scanf("%4d%2d%2d", &y2, &m2, &d2);
- int sum1 = sum_day(y1, m1, d1);
- int sum2 = sum_day(y2, m2, d2);
- if (sum1 >= sum2) {
- cout << sum1 - sum2 + 1;
- }
- else {
- cout << sum2 - sum1 + 1;
- }
- return 0;
- }
再展示算法笔记中的思路,使用的是ans变量从第一个日期慢慢加到第二个日期,得出的答案,值得参考,但是我没采用的原因是:如果两个日期差距很大,循环次数会非常多。
第二题:题目详情 - 1022 D进制的A+B (pintia.cn)
- #include<iostream>
- #include<vector>
- using namespace std;
-
- int main() {
- //10-->m进制数,可能超过int范围,选择用数组保存后逆序输出
- vector<int>v;
- int a, b, m;
- cin >> a >> b >> m;
- int sum = a + b;
- do {//sum一开始为0时可以用do...while循环
- v.push_back(sum % m);
- sum /= m;
- } while (sum);
- for (vector<int>::iterator i = v.end() - 1; i != v.begin(); i--) {
- cout << *i;
- }
- cout << *(v.begin());
- return 0;
- }
第三个是:题目详情 - 1032 挖掘机技术哪家强 (pintia.cn)
这题我感觉我的做法比答案要好一些,因为是输入的for循环中就找到了答案
- #include<iostream>
- using namespace std;
-
- int main() {
- int n;
- cin >> n;
- //注意是n+1(因为可能是第n个学校),列表初始化
- int* sum = new int[n+1] {0};
- int maximum = 1,info,score;
- for (int i = 0; i < n; i++) {
- cin >> info >> score;
- sum[info] += score;
- if (sum[maximum] < sum[info]) {
- maximum = info;
- }
- }
- cout << maximum << ' ' << sum[maximum];
- delete[]sum;
- return 0;
- }
第四个是:题目详情 - 1036 跟奥巴马一起编程 (pintia.cn)
这一题答案选择直接打印,空间复杂度比我用二维数组储存要好很多。
- #include<iostream>
- using namespace std;
- //对比算法笔记,他选择直接打印,没有使用数组储存,空间复杂度更好;
- int main() {
- int n;
- char c;
- cin >> n >> c;
- char arr[11][21];
- int row = n % 2 == 0 ? n/2 : n / 2 + 1;//注意奇数要四舍五入,即+1
- for (int i = 0; i < row; i++) {
- for (int j = 0; j < n; j++) {
- if (i == 0 || i == row-1||j==0||j==n-1) {
- arr[i][j] = c;
- }
- else {
- arr[i][j] = ' ';
- }
- }
- }
- for (int i = 0; i < row; i++) {
- for (int j = 0; j < n; j++) {
- cout << arr[i][j];
- }
- cout << endl;
- }
- return 0;
- }