重构

真二叉树重构(Proper Rebuild)

烂漫一生 提交于 2019-11-30 00:46:33
真二叉树重构(Proper Rebuild) Description In general, given the preorder traversal sequence and postorder traversal sequence of a binary tree, we cannot determine the binary tree. Figure 1 In Figure 1 for example, although they are two different binary tree, their preorder traversal sequence and postorder traversal sequence are both of the same. But for one proper binary tree, in which each internal node has two sons, we can uniquely determine it through its given preorder traversal sequence and postorder traversal sequence. Label n nodes in one binary tree using the integers in [1, n], we would like

如何做一个好的前端重构工程师2

假装没事ソ 提交于 2019-11-29 23:37:08
这里的“重构”指的是将设计图(比如PSD)转换为html + css + js。 用这个标题,是因为前一段时间组里有一个开放式讨论:怎样才算一个好重构? 其实,"好"与"坏"向来都是相对的,因为每个人眼中看待"好"与"坏"的标准不一样,不如从自身的角度考虑一下:如何做一个好重构? 先来看一个平时我们遇到的最多的两栏布局: 基本的html代码: 来看具体的CSS代码实现(忽略margin): 很明显在保持同样html结构的情况下,实现两栏布局可以有多种CSS方案实现(左栏定宽),主要方向是用浮动或不用浮动,右栏定宽或者不定宽: Qzone、朋友网、Facebook都给左栏浮动,唯一不同的是右栏的写法,Qzone给右栏定宽并且浮动,而朋友网和Facebook则并没有给右栏定宽也未浮动,而是利用了创建BFC并且为低版本IE触发hasLayout的原理让右栏自适应宽度。 Yahoo和Google两栏都未用浮动,唯一不同的是Yahoo用了绝对定位的方法,而谷歌用了inline-block,Google已经宣布旗下一些产品放弃对IE8 的支持,所以Google可以大胆的使用inline-block去实现布局,不用去为其他低版本浏览器写一大堆的hack。 这其中有最好的方案么?上面每一种方案都有各自的优劣,可能适合于某种项目背景,同样选用的方案可能和用户群体也有关系。虽然无论选用哪一种方案

旅游物料重构思路

▼魔方 西西 提交于 2019-11-29 21:13:48
  接管前账户以及网站存在的问题:   1.需要激活QQ,目前要添加为好友才能对话 比较麻烦   2.网站跳出率较高:   3、账户否词问题,移动出价比例问题。   4、账户计划繁多,匹配较为杂乱,重复计划多。   账户初步优化:   1.结构调整,把单元词类尽量细分些;   2.URL着陆页调整,询问价格词可以调整到价格的页面;   3.、旅游-B类,创意过少,一般一个单元是3-5个创意;后期进行添加创意;   4.URL添加关键词后缀,方便后期统计数据;   5.统计到关键词之后,可以根据词的咨询转化情况,调整重点关键词排名,降低消耗大,咨询低的关键词出价;   6.地域投放较广,后期可以根据分析重点地域,重点投放,无咨询地域可以进行筛减;   7.分析商务通时段咨询,可以分时段出价投放策略   8.PC比例占比过少,PC竞争较大,目前只有四个排位,可以适当的调整;   经过3-7天的优化以及前期对账户的结构的整理,投放,测试,反馈,调整,7天左右,基本账户就走上了正轨,每天咨询保持在30个左右,剩下的就是每月的维护,否词,增加关键词等操作。 百度竞价后台对于质量度的调整是发生在10.11号的夜里,对于这个调整,可能最初发现的就是医疗行业的朋友。这个信息出来以后,国内便刮起了一股优化质量度之风,经过前期一周的优化后,很多账户已经基本上来了,趋于稳定

superword中的模板抽取实践

倖福魔咒の 提交于 2019-11-29 20:48:16
superword这个项目,全使用JAVA8新特性: https://github.com/ysc/superword ,一开始只是我的一个英语单词分析工具,用于生成HTML片段然后发到博客中,后来功能越来越强于是我就做成一个项目了,再后来有人跟我说自己不是计算机专业的不会用这个软件,于是我就改造成了一个WEB项目,这个项目现在有点需要改进的地方,就是 把JAVA代码生成HTML的这个逻辑改成使用FREEMARKER的方式 。 我们首先来看在org.apdplat.superword.system.AntiRobotFilter类中的原来的 JAVA代码生成HTML的逻辑: StringBuilder html = new StringBuilder(); html.append("<h1>The meaning of red color font is your answer, but the right answer is the meaning of blue color font for the word <font color=\"red\">") .append(quizItem.getWord().getWord()) .append(":</font></h1>"); html.append("<h2><ul>"); for(String option :

《重构改善既有代码的设计》第2版 中文PDF

佐手、 提交于 2019-11-29 09:54:32
重构系列第二版,看过第一版的同学都指导这本书的价值所在,本书承继第一版的风格,从代码入手,一步一步进行优化,书中从案例入手,详细讲述了如何识别代码是否需要重构,如何重构,重构的原则,并且针对每一种糟糕的代码类型分别提出修改方案,再第四章开始,构筑测试体系,第五六七八章分别讲述了如何利用设计模式、封装更具有复用性的代码,以及后面讲述了如何处理继承关系,如何实现项目的松耦合相关内容 书文样张 百度云分享地址 链接: https://pan.baidu.com/s/1PGgxlY3EaRGGIEeYM08htw 不过笔者还是更支持购买正版书籍 来源: https://www.cnblogs.com/slymonkey/p/11511818.html

IntelliJ IDEA 快捷键终极大全

半世苍凉 提交于 2019-11-29 05:36:22
自动代码 常用的有fori/sout/psvm+Tab即可生成循环、System.out、main方法等boilerplate样板代码 。 例如要输入for(User user : users)只需输入user.for+Tab ; 再比如,要输入Date birthday = user.getBirthday()只需输入user.getBirthday().var+Tab即可。 代码标签输入完成后,按Tab,生成代码。 Ctrl+Alt+O 优化导入的类和包 Alt+Insert 生成代码(如get,set方法,构造函数等) 或者右键(Generate) fori/sout/psvm + Tab Ctrl+Alt+T 生成try catch 或者 Alt+enter CTRL+ALT+T 把选中的代码放在 TRY{} IF{} ELSE{} 里 Ctrl + O 重写方法 Ctrl + I 实现方法 Ctr+shift+U 大小写转化 ALT+回车 导入包,自动修正 ALT+/ 代码提示 CTRL+J 自动代码 Ctrl+Shift+J,整合两行为一行 CTRL+空格 代码提示 CTRL+SHIFT+SPACE 自动补全代码 CTRL+ALT+L 格式化代码 CTRL+ALT+I 自动缩进 CTRL+ALT+O 优化导入的类和包 ALT+INSERT 生成代码(如GET,SET方法

Kruskal重构树

孤街浪徒 提交于 2019-11-29 04:14:06
\(Kruskal\) 重构树 学习笔记 用途 \(Kruskal\) 重构树可以维护树上两个点联通的最长边的最小值。 实现 首先我们要知道一个叫最小瓶颈生成树的东西,它和最小生成树的不同的地方是最小生成树是要求权值总和最小而最小瓶颈生成树是要求最大边最小。回顾 \(Kruskal\) 算法,我们可以发现用这种方法生成的最小生成树一定是最小瓶颈生成树。 对于 \(Kruskal\) 算法过程,我们发现如果当前边连接两个联通块 \(A\) 和 \(B\) ,那么一定是 \(A\) 和 \(B\) 中的点互相联通的最长边的最小值。 有了以上结论我们发现我们可以将这个边值新建一个有权值的节点,这样如果以后要查询两个点联通的最长边的最小值只需要查它们的 \(LCA\) 的权值即可。 题目 \(Network\) #include<algorithm> #include<iostream> #include<cstdio> using namespace std; const int N=2e5+100,M=3e5+100; struct edge{ int s,e,v,net; }ed[N<<1],id[M]; int n,m,tot,k; int head[N<<1],size[N<<1],deep[N<<1],top[N<<1],father[N<<1],son[N<<1],f[N<

洛谷p1967货车运输(kruskal重构树)

老子叫甜甜 提交于 2019-11-29 01:43:34
题面 题解中有很多说最优解是kruskal重构树 所以 抽了个早自习看了看这方面的内容 我看的博客 感觉真的挺好使的 首先对于kruskal算法来说 是基于贪心的思想把边权排序用并查集维护是否是在同一棵树上 对于kruskal重构树来说 按不同边权顺序排序可相应的得到最大边权的最小值 、最小边权的最大值等问题 建树过程: 排好序后, 遍历, 若两条边u, v不在同一并查集内, 那么就新建一个节点, 这个节点的点权就代表u到v的边权, 同时将这三个点都加入同一并查集 需要注意 最后建立出来的可能是森林,也就是并不是所有的点的根都是相同的 此时 可以用一个vis数组来确保所有的点都被遍历过了 1.若按照边权的升序排列 那么最后可以求得最大边权的最小值 感性理解一下 因为最后是要求最小值 所以 建一棵最小生成树 此时最大的边权就是所有别的建树方法中的最小值 关于为什么lca是答案: 感性理解一下 如果我们建的树是最小生成树 那么 显然边权越大深度越深 我们是想按着边权尽量小的走 lca(u, v)是原图u->v节点深度最小的点 所以就是他了 2.若按照边权的降序排列 同上 要求最小边权的最大值 最后答案是最大值 那么建一棵最大生成树 关于此题的代码: #include <cstdio> #include <iostream> #include <algorithm> using

[Kruskal重构树][主席树] Luogu P4197 Peaks

匆匆过客 提交于 2019-11-28 21:41:59
给一个 N 个点的无向图,每个点有一个高度,每条边有一个困难度。 多次询问求从 V i 出发,只经过困难度小于等于 X i 的边所能到达的点中第 K 高的点。 Kruskal 重构树真是个好东西,既好写又好用。 这道题把树建出来后就变成了求某个点的叶子结点中第 K 大的点。 上面说的某个点就是 V i 在树中向上跳能跳到的点权 <= X i 的点, 这个东西显然可以用倍增来求。 因为是求第 K 大,所以还要套一个主席树。 1 #include<bits/stdc++.h> 2 #define rep(i,a,b) for(register int i=a;i<=b;++i) 3 #define rpd(i,a,b) for(register int i=a;i>=b;--i) 4 #define rep1(i,x) for(register int i=head[x];i;i=nxt[i]) 5 typedef long long ll; 6 const int N=5e5+5,M=5e5+5; 7 using namespace std; 8 inline int read(){ 9 int x=0,f=1;char ch=getchar(); 10 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 11 while

if-else 重构

主宰稳场 提交于 2019-11-28 21:05:04
最近发现自己写的代码if else太多了,有时候自己回头看都要重新捋逻辑,很不好。决定深入理解下if else重构。 中心思想: ①不同分支应当是同等层次,内容相当。 ②合并条件表达式,减少if语句数目。 ③减少嵌套,减少深层次逻辑。 ④尽可能维持正常流程代码在外层。 ⑤减少使用临时变量。 ⑥尽早return! 例子: ①异常逻辑处理。 public int getResult(int a, int b, int c){ int result = 0 ; if ( a > 0 ){ if (b > 0 && c > 0 ){ result = a * b * c; } } return result; } public int getResult2(int a, int b, int c){ if (a < 0 ){ return 0 ; } if (b <= 0 || c <= 0 ){ return 0 ; } return a * b * c; } 两种方式结果是一样的,这里重构的思想是: 1.首先减少深层嵌套,将if里的if提出来。 2.然后将非正常的情况放在最前面,并直接return。 ② 异常逻辑处理2 int getResult(){ int result; if (caseA) { result = functionA(); } else { if (caseB){