《算法笔记》- 第三章 - 学习记录

按时间线更新学习心得。

PAT B1032 - 挖掘机技术哪家强

  1. 模拟。
  2. maxn必须是常量(const),如果定义int maxn,则认为maxn可变,那么school[maxn]会报不是合法数组定义的错误。
  3. 记录最高分的变量初值赋为-1而非0,保证记录最高分学校的变量可以更新为某个学校编号。
  4. 注意审题:同一学校可有多个参赛者

codeup 1934 - 找x

  1. 查找,顺序存储。
  2. 文件输入,多组测试数据,用while循环依次读入,终止条件为输入的n是EOF。
  3. while(cin>>n),CLion退出:ctrl+D。

PAT B1036 - 跟Obama一起编程

  1. 模拟-图形输出,循环语句的常见用法(计数),找规律。
  2. 注意边界:N>=3,不用考虑N==1的情况了。
  3. “四舍五入”。

codeup 1928 - 日期差值

  1. 模拟-日期处理(天数++)。
  2. 用二维数组int month[13][2]存储每月对应天数,其中第二维为0时表示平年,为1时表示闰年。
  3. 设第一个日期小于第二个日期,前者年份不断加一,直至年份与后者差一(如果加到两个年份相等,由于第一个日期的月份数值可能比第二个大,就会产生错误),总天数相应地依次加上365或366;
  4. 此后第一个日期天数不断加一,如果加一天后天数等于本月份拥有天数加一,则月份加一,天数置为1号;如果此时月份变成了13,则令年份加一,同时置月份为1月。
  5. 天数累加的循环次数最多730次(366+365-1),时间效率可以保证。

代码如下:

#include <iostream>
using namespace std;
//存放各月份天数的二维数组
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}};
//判断闰年函数
bool isLeap(int y){
    return((y%4==0&&y%100!=0)||y%400==0);
}
int main() {
    int time1, time2, y1, y2, m1, m2, d1, d2;
    cin>>time1>>time2;
    //使得time1总小于time2
    if(time1>time2){
        int r=time1;time1=time2;time2=r;
    }
    //获得年月日数值
    y1=time1/10000; m1=(time1%10000)/100; d1=time1%100;
    y2=time2/10000; m2=(time2%10000)/100; d2=time2%100;
    int ans=1; //记录结果
    //先加年份,加到y2比y1大1时为止
    while(y2-y1>1){
        if(isLeap(y1)) ans+=366;
        else ans+=365;
        y1++;
    }
    while(y2!=y1||m2!=m1||d2!=d1){//不满足该布尔表达式的终止条件时执行循环
        ans++;
        d1++;//每次循环中天数先加一
        if(d1==month[m1][isLeap(y1)]+1){
            m1++;
            d1=1;
        }//如果天数溢出,则月份加一
        if(m1==13){
            y1++;
            m1=1;
        }//如果月份溢出,则年份加一;年份加一最多执行一次
    }
    cout<<ans<<endl;
    return 0;
}
3.5 进制转换
  1. 十进制转P进制:“除基取余法”
  2. x进制和y进制互转,常常用10进制作为中间过渡
//P进制数x转十进制数y
int y=0, product=1;
while(x!=0){
	y=y+(x%10)*product;
	x/=10; //每次去掉x的个位
	product*=P; //更新位权
}
//也可以用移位+加上当前个位的方法
//十进制数y转P进制数x
int z[40],num=0,x=0,q=1;
do{
	z[num++]=y%Q;//z[num-1]~z[0]按照从高位到低位的顺序存储x的各位
	y/=Q;
}while(y!=0);//do-while保证y初值为0时也进行一次循环,即使得z[0]=0
for(int i=num-1;i>=0;i--){
	x=(x+z[i])*q;
	q*=Q;
}
3.6 字符串处理
  1. 判断回文串:遍历前一半字符串(0 <= i < len/2),如果发现某个str[i]!=str[len-1-i],则不是回文串
  2. “单点测试”:

2020.1.29

第四章
4.1 排序
  1. 选择排序、插入排序
  2. C++ ‘algorithm’ 库的sort函数;cmp函数含义和写法
  3. 排名

2020.1.30

4.2 散列
  1. 散列:将元素通过一个函数转换为整数,使得该整数能尽量唯一地代表这个元素。空间换时间,使得单次查询复杂度降为O(1)。
  2. 常用散列函数:直接定址法(输入数字直接作为数组下标)、除留余数法、平方取中法
  3. 解决冲突:线性探查法、平方探查法、链地址法等
  4. P进制数和十进制数是一一对应的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值