PAT甲级 A1108之后

1108 Finding Average(字符串处理)

sscanf(s1.c_str(),"%lf",&temp);   将字符串的内容,按照指定格式,写入变量。
sprintf(s2,"%.2f",temp);  反之。

1110. Complete Binary Tree!!!(完全二叉树)  

1.怎么找根:没有出现在子节点中的结点,就是根。初始化一个bool数组。

2.完全二叉树用数组刚好是【1,n】存储,最大索引值=结点总个数!!!

3.用层序遍历,判断一棵树是不是完全二叉树(为null的结点之后,是否都是null的结点)

1112 Stucked Keyboard(简单模拟)

1.样例”thiiis iiisss a teeeeeest“中的s不和要求,用一个bool型数组判断,输出时删掉才为最后答案;

2.输出的次序,按照原数组决定,不能用map

1116 Come on! Let's C

看清题目的输出格式,不要犯这种无谓的错误!!!

1118 Birds in Forest(并查集,类比1107)

相同的鸟,出现在同一棵树。

tree[bird_id] = tree_id; 通过鸟绑定树。

1119 Pre- and Post-order Traversals(“如何建树”)

1.对于一个父节点,只有一个孩子,它的前序和后序得到的树,可能不同。

eg 1 2 3 4 和 2 4 3 1

2. 建树原理:

(1)在前序序列中,前序序列的第二个节点就是第一个节点的左子树的根节点,我们暂且记该节点为p
(2)在后序序列中,后序序列的倒数第二节点就是倒数第一个节点的右子树的根节点 ,我们暂且记该节点为q
(3)给定一个结点root,如果它有双子树(存在左右子树)那么必定有p!=q。也就是先序序列的第二个节点不会等于后序序列的到数第二个节点。
(4)给定一个节点root,如果它只有单子树(存在左或右子树)那么必定有p==q。也就是先序序列的第二个节点肯定等于后序序列的倒数第二个节点)。单子树,说明结果不唯一!!!

3.getIn()相当于按照中序遍历的顺序,划分左右子树序列。找到递归的边界!!!

bool uniquee = true;
void getIn(int preL,int preR,int postL,int postR){//中序建树
    if(preL==preR){     //划分的区间内只有一个结点!!!
        in.push_back(pre[preL]);
        return;
    }
    if(pre[preL]==post[postR]){ //根结点
        int i = preL+1;
        while(pre[i]!=post[postR-1])i++;  //找到先序中,根节点的左子树的根节点
        int numleft = i-preL-1;
        if(i-preL>1){ //大于1表示,存在双子树,还能继续划分左子树(先序中左子树的根节点和右子树的根节点不等)
            getIn(preL+1,i-1,postL,postL+numleft-1);
        }
        else uniquee = false;  //单子树,可为左子树,亦可为右子树!!!
        in.push_back(pre[preL]);   //放入根节点
        getIn(i,preR,postL+numleft,postR-1);
    }
}

1122 Hamiltonian Cycle(哈密顿回路,图的应用,类比1150)

 判断节点是否多走、少走、或走成环,可以使用set<int> ans记录结点。

1123 Is It a Complete AVL Tree

判断是不是完全二叉树:在层序遍历中,出现了一个孩子为空的结点之后,是否还会出现孩子结点不为空的结点,如果出现了就不是完全二叉树。

1124 Raffle for Weibo Followers

逻辑关系:当一个人中奖之后,以他为起点,从新开始间隔。

1126 Eulerian Path(欧拉回路,判断图的连通性)

DFS,若走过的结点数目=总结点数目,则其连通。(用到bool vis[maxn])

1127. ZigZagging on a Tree  

vector<int> pre[maxn]存储同层结点,然后输出。

1132 Cut Integer

1.读懂题目: “It is interesting to see that Z can be devided by the product of A and B, as 167334 / (167 × 334) = 3”中“be devided by” 被除以的意思。另外,除数不能为零。

2.一个数划分成两个数,考虑是否为零,如100000被分成100和0。

3.字符串截取,l=m.substr(0,m.size()/2);

1141 PAT Ranking of Institutions(经典sort排序题)

1.大小写转换,两种方法。

2.利用map进行映射,学校名唯一。map<string,int> ans;

if(ans.count(str)==0)  表示之前没有录入这个学校的信息。

3.遇到小数,需要将全部数值进行强制转换,统一再赋值。(坑)

4.字典序比较 a = "hbcd'; b = "ghci";   —>  a<b   return时要细心!!!

1143 Lowest Common Ancestor(类比1151,找“根”,与“根”比较)

核心思想:BST插入顺序,就是其先根遍历顺序,每一个都是根。(利用性质~)

1144 The Missing Number

1.a positive integer N (≤1e5),缺少的最小正整数可以为1e5+1;

2.段错误的原因:缺少的最小正整数必然在1~1e5+1,若输入的数超过这个范围,会造成数组越界。

1145 Hashing - Average Search Time(哈希平方探测法)1078

1.浮点数输出 printf("%.1f\n",ans*1.0/m);

2.因为(key+Msize*Msize)%Msize代表搜索回到了原地,这时可以认为无法搜索到这个数字。“相当于要多一次验证的次数,判空。

1148 Werewolf - Simple Version

1.下标从1~N,vector<int> a; a.resize(n+1);

2.暴力求解:

for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            vector<int> lie,a(n+1,1);
            a[i] = a[j] = -1; //假设这两个人是狼人
            for(int k=1;k<=n;k++){
                if(v[k]*a[abs(v[k])]<0) //说的与事实相反
                    lie.push_back(k);
            }
            if(lie.size()==2&&a[lie[0]]+a[lie[1]]==0){ //两人说谎,刚好一人一狼
                cout<<i<<" "<<j<<endl;
                return 0;
            }
        }
 }
 cout<<"No Solution"<<endl;

1150 Travelling Salesman Problem(图的应用)

计算路径时,当判断两边不可达时,直接break,不然逐步累加可能造成越界。

1151 LCA in a Binary Tree(中序划分子树)

1.用map<int,int> pos记录某元素是否出现,数字下标从1开始,避免和map[int] =0 冲突。

2.pos记录元素在中序数组中出现的位置。

1152 Google Recruitment(字符串处理)

1.取中间字串,确定起始位置。(别粗心)

2.stoi(str)字符串变数字

3.补零操作。

1155 Heap Paths(堆的性质、DFS遍历)

1.直接利用大、小根堆的性质解题。

2.DFS遍历,用vector<int> temp保存一路上的节点,通过push和pop回溯,维护路径。根节点无需回溯,可以一开始就加入!!!

1156 Sexy Primes(质数)

Sexy primes are pairs of primes of the form (p, p+6),p和p+6都是质数,两个条件同时满足。

1159 Structure of a Binary Tree(树的综合运用)

1."a full binary tree is a tree (in which every node (other than) the leaves has two children.)一个结点只有右子树而没有左子树,或者只有左子树没有右子树。

2.unoder_map<int,node* >mp,保存结点的值与结点之间的关系,查找效率更高。

3.对于使用getline(cin,temp)之前,在上一输入后,使用getchar()吸收换行。

4.使用str.find("xxx")!=string:npos进行查找。

5.sscanf通常被用来解析并转换字符串.

函数原型:

#include <stdio.h>
int sscanf(const char *str, const char *format, ...);

其中,对于string要是用string.c_str()进行转换。c_str()是String类中的一个函数,它返回当前字符串的首字符地址。换种说法,c_str()函数返回一个指向正规C字符串的指针常量,内容与本string串相同。这是为了与C语言兼容,在C语言中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成C中的字符串样式。

例子:

int year, month, day;
int converted = sscanf("20191103", "%04d%02d%02d", &year, &month, &day);
printf("converted=%d, year=%d, month=%d, day=%d/n", converted, year, month, day);

1163 Dijkstra Sequence(判断最短路径序列)

核心思想:比较d[i]和d[i+1]的大小关系。

1167 Cartesian Tree(中序找根建树)

小技巧:利用map<int,int> ans存储结点,ans只存储存在的键值对。

层序输出为:

for(auto i:ans){

        if(i.first!=1)cout<<" ";

        cout<<i.second;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值