Live2D

【读书笔记】《王道论坛计算机考研机试指南》 第二、三章

先分享一下《2013年王道论坛计算机考研机试指南》pdf
链接:https://pan.baidu.com/s/1w_nfGVtU40pZrUggAYfQDA
提取码:aaaa

第二章 经典入门

排序问题

1.C++ 头文件algorithm中的sort函数,当规模较大时为快速排序,规模较小时采用其他排序方式

日期类问题

1.把区间问题统一到一个特定时期与一个原点时间的天数差。可进行预处理,将所有日期距离原点日期的天数存起来,预处理也是空间换时间的重要手段。

2.将数据本身与数据存储地址联系起来(hash思想)

3.需要开辟大量内存空间的情况,必须在函数体外定义,即定义为全局变量,或者在函数中使用malloc等动态申请变量空间。因为函数所使用的栈空间不足以提供大量内存,可能出现栈溢出,导致程序异常终止

4.当进行模运算时不能先取绝对值在进行模运算,这样不是正确答案,因先进行模运算,再加上模再进行一次模运算

int m;    //不确定正负
int n=(m%7+7)%7;

5.

scanf("%4d%2d%2d",&year,&month,&day)    //可读取“20140809”这样的日期格式
scanf("%d",&a)!=EOF;                    //可作为循环结束的标志,ctrl+z则可使scanf返回EOF

6.判断是否为闰年

#define ISYEAR(x) x%100!=0&&x%4==0||x%400==0?1:0

hash的应用

1.当输入数据有范围时,可考虑使用数值对应地址的方法存储,以空间换时间

2.机试时,注意输出格式中的空格或者换行

排版题

1.当图形的规律从第一行第一个开始不好推算把握时,可先建立数组,先排版再输出。(eg叠筐)

2.疑问

//叠筐中用了一个循环条件
while(scanf("%d %c %c",&a,&b,&c)==3);  

scanf()函数的返回值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。

查找

1.二分法

int lookup(int aim,int min,int max)
{
    int mid=(min+max)/2;
    if(aim==mid)
        return mid;
    else if(aim<mid)
        lookup(aim,min,mid+1);         //注意这里的加一
    else if(aim>mid)
        lookup(aim,mid+1,max);        //加一
}

第三章 数据结构

栈的应用

1.基础操作
头文件:#include<stack>

stack<int> S;            //定义
count=S.size();         //count为栈中元素数目
a=S.top();              //a为栈顶元素
S.pop();                //弹出栈顶元素
S.push(a);              //在栈顶增加元素
bool=S.empty();         //堆栈为空则返回真

2.关于输出小数

#include<iomanip>                              //头文件
cout<<fixed<<setprecision(n)<<flag<<endl;      //输出保留n位小数 
cout<<setprecision(n)<<flag<<endl;             //保留n位有效数字
cout<<setw(5)<<a<<endl;                        //控制输出宽度为5,默认右靠齐
cout<<setw(5)<<setfill("0")<<a<<endl;          //默认宽度为5,前面空白处以‘0’填充

哈夫曼树

1.优先队列

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。

在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。包括队列的基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的。

和队列基本操作相同:

q.top();    //访问第一个元素
q.empty();    // 队列是否为空
q.size();     // 返回队列内元素个数
q.push();     // 插入元素到队尾 (并排序)
q.emplace();  // 原地构造一个元素并插入队列
q.pop();      // 弹出队头元素
q.swap();     // 交换内容

定义优先队列

priority_queue<int> Q;          //默认为大顶堆
priority_queue <int,vector<int>,greater<int> > q;    //升序队列,取出的为队列中最小的元素,相当于小顶堆
priority_queue <int,vector<int>,less<int> >q;        //降序队列,相当于大顶堆

插一条刚刚查的:oj全称:online judge 23333333

当数据类型为结构体时,需重载小于运算符,类似于sort函数cmp重载(由于内部函数调用小于号排序,所以无论想要大顶堆还是小顶堆都重载小于符号,例如:

//第一种
struct node{
    int x;
    int y;
    friend bool operator < (const node &a,const node &b)
    {
        return a.x>b.x;           //此处为大于号,结果为小顶堆;若此处为大于号则为大顶堆
    }
};

//第二种
struct node{
    int x;
    int y;
    bool operator < (const node &a) const
    {                              //此时自身为第一个参数,a为第二个参数
        return x>a.x;              //此处为大于号,结果为小顶堆;若此处为大于号则为大顶堆
    }
};

2.哈夫曼树求权值和处理方法

只需定义一个小顶堆,无需定义结构体,定义权值和sum=0,sum每轮循环加上选出的最小的两个元素和,则恰好为权值和,而无需等哈夫曼树建立好了之后再根据各自路径长短和权值计算后再相加。
Alt text

二叉树

1. 结构体

typedef struct Tree{
    struct Tree* lchild;
    struct Tree* rchild;
    //一些其他的结点信息
    int data;
}*BiTree,Tree;

2. 树的遍历

//先序递归
void preorderTraverse(Tree *T)
{
    if(T)
    {
        VisitF(T->data);//访问根节点
        PreOrderTraverse(T->lchild);//递归左子树
        PreOrderTraverse(T->rchild);//递归右子树
	}
}
//中序递归
void InOrderTraverse(Tree *T)
{
 
    if( T )
    {
        InOrderTraverse(T->lchild);
        VisitF(T->data);
        InOrderTraverse(T->rchild);
    }
}

//后序递归
void PostOrderTraverse(BiTree T)
{
 
    if( T )
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        VisitF(T->data);
    }
}

3.
注意在创造树结点时记得将左右子树初始化为NULL,否则很可能遍历时因为lchild、rchild指针不存在而出现段错误。

BiTree create()         //申请一个结点空间返回其指针
{
    BiTree T=(BiTree)malloc(sizeof(BiNode));
    T->lchild=NULL;               //!!!重要!!!
    T->rchild=NULL;               //!!!重要!!!
    return T;
}

4.3.4值得一看 链接:https://www.cnblogs.com/wwj321/p/12362679.html

posted @ 2020-02-20 16:52  WSquareJ  阅读(529)  评论(0编辑  收藏  举报