算法笔记 --第三章 入门篇(1) 入门模拟

这里写图片描述

读书笔记

日期处理

case1:
不要把年月日yyyy:mm:dd分开处理,而是装入long long,如下

long long date = yyyy*10000+mm*100+dd;

适合存储日期和单纯地比较日期大小
这题:人口普查,用这种处理方法是最好的


case2:计算日期差值
如果是这个情况,就要注意平年和闰年,大月和小月的情况。
大小月可以使用二维数组解决

int month[13][2]={
	{0,0};{31,31};{28,29};{31,31};{30,30};{31,31};{30,30};
		;{31,31};{31,31};{30,30};{31,31};{30,30};{31,31}
};

判断平闰年
普通年:能被4整除但不能被100整除的年份为普通闰年。
世纪年:能被400整除的为世纪闰年。

int isLeap(int year){
	return (year % 4 == 0 && year %100 != 0) || (year %400 == 0); 
}

英语月份转换为数字

char english_month[13][10] = {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
int english2num(char *month){
    for(int i=0; i<12; i++)
        if(strcmp(english_month[i], month) == 0)
            return i+1;
    return 0;
}







推荐Leetcode上这几道题练习日期处理
1154. 一年中的第几天
1185. 一周中的第几天
1360. 日期之间隔几天


进制转换

对于两个不同进制:P,Q
对于一个P进制的数,怎么转换成Q进制的数呢?这要分为两步:
①将P进制转换成10进制数y
②将y转换成Q进制。

P进制转换为10进制
对于数A= a 1 a 2 a 3 . . . . . . a n − 1 a n a_{1}a_{2}a_{3}......a_{n-1}a_{n} a1a2a3......an1an
公式 y = a 1 ∗ P n − 1 + a 2 ∗ P n − 2 + . . . . . . . . + a n − 1 ∗ P + a n y=a_{1}*P^{n-1}+a_{2}*P^{n-2}+........+a_{n-1}*P+a_{n} y=a1Pn1+a2Pn2+........+an1P+an

// y 是待转换的数,P是进制
int trans(int y,int P){
	int result=0,product=1;
	while(result != 0){
		result += (y%10) * product;         
		y /=10;
		product *=P;
	}
	return result;
}

待转换的值可能是intlong long装不下(可能P是二进制,所以装不下),要用字符串才能装下。小心这个坑,下面的Code是针对输入的值是string

int trans(string x,int P){
	int result = 0;
	for (auto ch : x) {
		result = result*P + (ch - '0');
	}
	return result;
}

当然:有个偷懒的方法:可以使用stoi()函数进行进制转换。

如果要转换的数在int中,那先通过to_string()转换为string
通过 stoi函数进行进制转换。 
/*
parameter 1: string ,待转换的数字
parameter 2: size_t *的偏移,不用管
parameter 3: 该数的进制,0表示不转化,只能转换2~36进制 
*/
stoi(to_string(x),0,P)  //X是该数,P是进制
stoi(x,0,P)     //X是该数 ,P是进制

这样就能把P进制转换为10进制了




10进制转换为Q进制
除基取余法即可

//x是输入,Q是y的进制
//转换后的数是z[z.size()-1]到z[0]
vector<int> trans(int x,int Q){
	vector<int> z;
	do{
		z.push_back(y%Q);
		y/=Q;
	}while(y!=0);
	return z;
}

这题D进制下的A+B,是这方面的题

迭代

这类模拟题要么是给出一个复杂的表达式,要么是给出复杂的关系。
这个时候可以使用迭代法:也就是暴力法。
表达式总会有个取值范围吧,复杂的关系总会可一条一条的罗列出来可以的关系吧。迭代法就是暴力的枚举每一种情况:看这一种情况符不符合题目的要求。这种题本来不难,但是大家估计不会不想用暴力迭代做出来。
下面两道题可以参考做一下。
在这里插入图片描述
Hello World for U
狼人杀


字符串处理

千变万化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值