前言:此篇博客整合小编所遇到的算法问题中有时候会卡住的一些知识点,此博客中所有的代码仅可适用于一部分题目,并非万能模板,但能提供一定思路,即读者可以根据所提供的代码模板,进行改进从而能适用于所遇到的问题。
一.时间、日期惯用套路
在对于算法题中,我们经常会遇到时间问题,而这些问题中有很多都是和日期天数、判断日期条件和输出特殊日期相关。
以下代码是解决两个日期之间相隔多少天问题的代码模板:
static int[] months={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年的月份天数
public static int isLeap(int year){
if(year%100&&year%4==0||year%400==0){
return 1;
}
return 0;
}
public static int getMonthDays(int year,int month){
int res=months[month];
if(month==2){
res+=isLeap(year);
}
return res;
}
public static int getTotalDays(int y,int m,int d){
int res=0;
for(int i=1;i<y;i++)
res+=365+isLeap(i);
for(int i=1;i<m;i++)
res+=getMonthDays(y,i);
return res+d;
}
输入: y1,m1,d1
y2,m2,d2
则总天数为:getTotalDays( y1,m1,d1)-getTotalDays( y2,m2,d2);
二.产生回文八位数
在很多题目中,会让我们输出回文数,以下代码是解决回文日期时候所产生的一段代码:
for(int i=1000;i<10000;i++){
int date=i;
int x=i;
for(int j=0;j<4;j++){
date=date*10+x%10;
x/=10;
}
}
最后输出的date即为回文八位数
三.字符串和数字类型的相关问题
在做算法题中,我们经常会遇到需要运用字符串的相关知识,很多时候经常会感到无从下手,接下来提供一些子问题的代码以供读者参考和回顾。
将字符串类型的数组转化为int类型
String str="2024";
int x=0;
for(int x=0;i<str.length();i++){
x=x*10+str.charAt(i)-'0';
}
将char类型数字转换成int类型
char ch='5';
int num=(int)(ch-'0');
提取一个整数中的某一个数字
这段代码比较具有普遍性,可以直接放在循环当中使用
int num=123456;
int digit=(num/(int)Math.pow(10,position))%10;
四.数学知识
在算法题中,我们经常会用到一些已有的数学定理来帮助我们更快的解决问题:
1.两个互质的正整数a,b,所不能凑出来的最大正整数为a*b-a-b
2.皮克定理:用于计算一个简单多边形的面积,当这个多边形的所有顶点都位于整数坐标点上,面积A等于内部格点数I和边上格点数B的半数减一,即A=I+B/2-1
3.贝祖定理:对于任何非零整数a和b,存在整数x和y,使得ax+by=gcd(a,b)