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;
}