数据结构day11

总结:自己二叉树写蒙圈了,pta答案网上良莠不齐,所以我选择跟着算法笔记刷,这两天写了不少简单题,今天写了5个简单模拟题,最后的日期差值还有问题没有解决;

Codeup新家 (hustoj.com)

日期差值_牛客题霸_牛客网 (nowcoder.com)

我们就先看日期差值这题吧,我想的是用第一个日期的总天数减去第二个日期的总天数,在牛客网上全通过了,但是在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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值