ARTS (第54周)
写出“能用”代码的人比比皆是,但是,并不是每个人都能写出“好用”的代码。只会写能用的代码,我们永远成长不成大牛,成长不成最优秀的那批人。
极客时间-《设计模式之美》 https://time.geekbang.org/column/article/160463
Algorithm 算法
平衡二叉树
1 | 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 |
解法1 递归所有子节点和深度
1 | // 递归 |
解法2 递归优化
其实本质是个后序遍历
1 | // 递归 后序遍历 |
数组中只出现一次的数字
1 | 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 |
解法
最简单的就是哈希表之类的key-value类型储存,这里我就不写了。
如果结果是只有1个数字,全部进行异或即可,但这里是2个数字,所以全部异或的结果,是两个数字的异或结果。
根据结果的二进制,找出为1的位,就代表2个数字的这个位是不一样的。根据这个位,将数组分成两组,分别进行异或,就能找出那两个不同的数字。
1 | public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) { |
和为S的连续正数序列
1 | 题目描述 |
解法 穷举所有情况
1 | // 穷举 |
解法 双指针
通过大小两个指针之间的值进行判断
1 | // 双指针 |
和为S的两个数字
1 | 题目描述 |
解法 双指针法
1 | public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) { |
左旋转字符串
1 | 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! |
解法1 用一个char数组接收到对应位置的char值后构建一个新的string
1 | // 简单 |
解法2 看到的精巧的做法
str += str;然后截取对应位置的数据即可,很精巧。
1 | // 精巧 |
解法3 reverse方法
三次翻转之后,结果刚好就是自己想要的
1 |
|
翻转单词序列
1 | 题目描述 |
解法1 用空格拆分数组后,从后向前拼接即可。
这里依然可以用reverse。一个一个单词reverse ,然后整体reverse。
1 | // 反转 |
扑克牌顺子
1 | LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。 |
解法
其实这里的题目就是2个目的。做完后,看到的多种解法都是为了这两个目的,只是实现方式不太一样。
除0外没有重复的数
max - min < 5
1 | public boolean isContinuous(int[] numbers) { |
Review 英文文章
https://spring.io/guides/gs/messaging-jms/
spring整合jms,以及提供的JmsTemplate`
Tip 技巧
面向对象面的3W模型
封装
What:隐藏信息,保护数据访问。
How:暴露有限接口和属性,需要编程语言提供访问控制的语法。
Why:提高代码可维护性;降低接口复杂度,提高类的易用性。
抽象
What: 隐藏具体实现,使用者只需关心功能,无需关心实现。
How: 通过接口类或者抽象类实现,特殊语法机制非必须。
Why: 提高代码的扩展性、维护性;降低复杂度,减少细节负担。
继承
What: 表示 is-a 关系,分为单继承和多继承。
How: 需要编程语言提供特殊语法机制。例如 Java 的 “extends”,C++ 的 “:” 。
Why: 解决代码复用问题。
多态
What: 子类替换父类,在运行时调用子类的实现。
How: 需要编程语言提供特殊的语法机制。比如继承、接口类、duck-typing。
Why: 提高代码扩展性和复用性。
3W 模型的关键在于 Why,没有 Why,其它两个就没有存在的意义。从四大特性可以看出,面向对象的终极目的只有一个:可维护性。易扩展、易复用,降低复杂度等等都属于可维护性的实现方式。
摘自 极客时间,用户:Smallfly
Share 分享
极客时间《设计模式之美》1~6章