读书笔记
日期处理
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......an−1an
公式
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=a1∗Pn−1+a2∗Pn−2+........+an−1∗P+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;
}
待转换的值可能是int或long 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
狼人杀
字符串处理
千变万化