算法竞赛中常见问题(整合版)

前言:此篇博客整合小编所遇到的算法问题中有时候会卡住的一些知识点,此博客中所有的代码仅可适用于一部分题目,并非万能模板,但能提供一定思路,即读者可以根据所提供的代码模板,进行改进从而能适用于所遇到的问题。

一.时间、日期惯用套路

在对于算法题中,我们经常会遇到时间问题,而这些问题中有很多都是和日期天数、判断日期条件和输出特殊日期相关。

以下代码是解决两个日期之间相隔多少天问题的代码模板:

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)

算法竞赛入门经典问题是指在算法竞赛常见的一些问题,这些问题通常涉及算法数据结构的基本知识。在解决这些问题时,需要注意一些提示和技巧。例如,在算法竞赛,不应该在输入前打印提示信息,并且在输出完毕后应立即终止程序。此外,应该避免使用头文件conio.h的函数,如getch()和clrscr()。在输出时,每行的行首不应有空格,每两个数或字符串之间应以单个空格隔开,并以回车符结束。逻辑运算符在C语言是短路运算符,一旦能够确定整个表达式的值,就不再继续计算。在处理多个并列、情况不交叉的条件时,可以使用else if语句。在编程过程,适当添加注释可以帮助他人更快地理解程序,并帮助自己整理思路。此外,可以使用花括号将若干条语句整合成一个整体。在学习编程时,应该尽量在计算机旁阅读书本,并将书的程序输入到计算机进行调试,并进行上机练习。重要的是要练习,而不仅仅是看和听。通过实践,可以更好地掌握编程技巧和知识。 #### 引用[.reference_title] - *1* *2* *3* [《算法竞赛入门经典》——刘汝佳](https://blog.csdn.net/qq_54053990/article/details/119293984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值