《跟英雄哥学算法第二天》


今天做一下总结,感觉现在我做啥题都很吃力,自己一个题想很久都么思路,有了思路还是实现不了,但是看了别人的代码自己懂了之后能实现出来,我是接收知识比较慢的那种人,不能抱怨,只能低下头继续写代码,这时候沉住气,千万别和人家的厉害的比,自己做好自己的,别比进度,加油啊,相信自己。


《算法零基础100讲》(第6讲) 日期算法_英雄哪里出来-CSDN博客

力扣:1154. 一年中的第几天 - 力扣(LeetCode) (leetcode-cn.com)

《跟英雄哥学算法第二天》

先说一下这个题的解题思路:
题目条件是给你年/月/日,让你算一下这一天是这一年的第几天,我们肯定会想到把这个月的前几个月(也就是1月到本月的前一个月(不包括本月))加上,在加上天数就是我们所要求解的,但是尤其不要忘记还要判断这一年是闰年还是平年,它们的2月份天数不一样,闰年是29天,平年是28天。这样的思路就差不多了,还有一点就是由于力扣本身给我们的接口,输入的年月份是字符串,所以我们就要把字符串里的年月日转化成数字。

//判断闰年or平年//(1)
bool is_leap_year(int year){
    if(year %4 ==0 && year % 100 !=0 || year % 400==0)
    {
        return true;
    }
    return false;
}
//提取字符串中的年月日//(2)
int StroInt(char*str,int len){
     int i = 0;
     int sum=0;
     for(i=0;i<len;i++){
      sum=sum*10+(str[i]-'0');
     }
     return sum;
}
int dayOfYear(char * date){
    int mounthday[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//(3)
    int i;
     int sumday[13];
    int year,day,mounth;
    year=StroInt(date+0,4);//(4)
    mounth=StroInt(date+5,2);//(5)
    day=StroInt(date+8,2);(6)
    sumday[0]=0;//(7)
    mounthday[2]= is_leap_year(year) ? 29 : 28;//(8)
    for(i=1;i<mounth;i++){//(9)
        sumday[i]=sumday[i-1]+mounthday[i];
    }
     return sumday[mounth-1]+day;//(10)
}

(1):判断闰年还是平年

《跟英雄哥学算法第二天》

 所以就是能被4整除并且不能被100整除或者能被400整除的数字;

(2):利用ASCII码值进行将字符串转化成数字,当然也可以用atoi函数

《跟英雄哥学算法第二天》

(3):创建一个数组表示每个月有多少天,其中第一个设置为0天是为了防止在后面累加天数的时候溢出;

(4):提取年份(也就是从第一个到第四个)

(5):提取月份(也就是从第5个到第7个(这里也就是从第五个开始往后两个))

(6):提取年份(也就是从第8个到第10个 (这里也就是从第8个开始往后两个))

(7):这时累加天数将下标为0时初始化为0与上面创建数组相照应。

(8):2月份如果是闰年就为29天否则平年28天。

(9):从一月开始一直到本月的前一月进行累加天数

(10):将本月的前一月累加的天数再加上本月的第几天最后就是答案了。


【第52题】qsort 结构体 应用 | 对二维空间中的点进行排序_英雄哪里出来-CSDN博客

#include<stdio.h>
#include<stdlib.h>
//定义一个结构体
struct Point
{
	int x, y;//x坐标 y坐标
}pt[10001];

int  cmp(const struct Point* pa, const struct Point* pb)
{
	if (pa->x == pb->x){
		return pa->y - pb->y;
	}
	return pa->x - pb->x;
}
 
void input(int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d %d", &pt[i].x, &pt[i].y);
	}
}
void output(int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%d %d\n", pt[i].x, pt[i].y);
	}
}
int main()
{
	int n;
	while (scanf("%d", &n) != EOF) {
		//输入函数
		input(n);
		//qsort函数实现
		qsort(&pt, n, sizeof(pt[0]), cmp);
		//输出函数
		output(n);
	}
	
	return 0;
}

上一题进阶排序结构体字符串

typedef struct student
{
	char name[20];

}Stu;

int cmp(const void* pa, const void* pb)
{
	return strcmp(((Stu*)pa)->name, ((Stu*)pb)->name);
}

void print(Stu s[],int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++) {
		printf("%s ", s[i].name);
	}
}

int main()
{
	Stu s[3] = { {"wangermazi"},{ "zhaolaowu"},{"gulaosan"} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp);
	print(s,sz);
	return 0;
}

《跟英雄哥学算法第二天》

【第53题】二维数组的应用 | 求二维数组每一行的最大值_英雄哪里出来-CSDN博客_c语言求二维数组每行最大值

#define maxn 110
int a[maxn][maxn];
#include<stdio.h>

void input(int m, int n, int a[][maxn])
{
	int i, j;
	for (i = 0; i < m; ++i) {
		for (j = 0; j < n; ++j) {
			scanf("%d", &a[i][j]);
		}
	}
}

void output(int m, int n, int a[][maxn])
{
	int i, j;
	for (i = 0; i < m; ++i) {
		for (j = 0; j < n; ++j) {
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	
}

renew_a(int m, int n, int a[maxn][maxn])
{
	int i, j,max;
	for (i = 0; i < m; ++i) {
		 max = a[i][0];
		for (j = 1; j < n; ++j) {
			if (a[i][j] > max) {
				max = a[i][j];
			}
		}
		a[i][0] = max;
	}
}

int main()
{
	int n = 0;
	int m = 0;
	while (scanf("%d %d", &m, &n) != EOF) {
		//输入函数
		input(m, n,a);
		//排序
		renew_a(m,n,a);
		//输出函数
		output(m, n, a);

	}
	return 0;
}

这个题主要是renew_a这个函数;

先把二维数组的每一行的第一个元素当做这一行中最大的元素,然后依次枚举这一行的所有元素找到最大的那个元素,跳出for循环将其放在第一个。

上一篇:学位论文latex模板使用中遇到的坑总结


下一篇:pt-table-checksum