ARST挑战 第1周
这次是开始执行ARTS的第一周,说来真是惭愧,虽然大学读的是计算机本专业,但是大学四年里面,只着重开发工具的熟练,却忘记的勤修内功。出来工作之后,才知道这些东西的宝贵,也懂得了,以为最快的捷径,却发现是走的最慢的,所以参加了由左耳朵耗子发起的ARTS挑战,目的为了提高技术深度之外,也是为了一步步杜绝自己眼高手低的做法。无论时间长短,都从最简单的开始做起,一来查漏补缺,二来可以巩固知识,现在开始第一周的挑战。
1 Algorithm977. Squares of a Sorted ArrayGiven an array of integers A sorted in non-decreasing order, return an array of the squares of each number, also in sorted non-decreasing order.Example 1:Input: [-4,-1,0,3,10]Output: [0,1,9,16,100]Example 2:Input: [-7,-3,2,3,11]Output: [4,9,9,49,121]
这道题,看起来倒不是很难,例如用Java的银弹工具类足以实现,例如下面这种解法:
1 class Solution { 2 public int[] sortedSquares(int[] A) { 3 if(A.length == 1) 4 return new int[]{ A[0] * A[0] }; 5 for (int i = 0; i < A.length; i++) { 6 A[i] = A[i] * A[i]; 7 } 8 Arrays.sort(A); 9 return A; 10 } 11 }
但是这样借助工具类,倒是失去了刷题的意义,所以就开始重新解题,此题难度当然容易,关键在于排序,本人对应插入排序法的算法不是很熟悉,所以便采用了插入排序法来排序。所以就有了下面的解法:
1 public int[] InsertSort(int[] A) { 2 int temp = 0, index = 0; 3 for (int i = 1; i < A.length; i++) { 4 temp = A[i]; 5 index = i; 6 while (index > 0 && A[index - 1] > temp) { 7 A[index] = A[index - 1]; 8 index--; 9 } 10 A[index] = temp; 11 } 12 return A; 13 } 14 /** 15 * 16 * @param A 17 * @return 18 */ 19 public int[] sortedSquares(int[] A) { 20 if (A.length == 1) 21 return new int[] { A[0] * A[0] }; 22 for (int i = 0; i < A.length; i++) { // 第一层循环 23 A[i] = A[i] * A[i]; 24 } 25 return InsertSort(A); 26 }
参考各路大神,觉得更好好当属下面这种解法:
1 /** 2 * 利用进行前后哨兵交换 3 **/ 4 public int[] sortedSquares(int[] A) { 5 int n = A.length; 6 int[] result = new int[n]; 7 int i = 0, j = n - 1; 8 for (int p = n - 1; p >= 0; p--) { 9 if (Math.abs(A[i]) > Math.abs(A[j])) { 10 result[p] = A[i] * A[i]; 11 i++; 12 } else { 13 result[p] = A[j] * A[j]; 14 j--; 15 } 16 } 17 return result; 18 }
2 Review
当Java程序员纠结于各种通讯框架如Netty,Mina的时候,似乎忘记了回归NIO的学习,虽然框架的诞生某些时候给我们带来便捷的同时,却也给我们探索真相的路上多了一份障碍。NIO学习当大多数人看完所有API的时候,却还是不能够手动写出有实践意义的代码,就如我而言,看了整个NIO的API的时候,却只能写写里面的示例代码,整个过程得不到有效的串联,这时候就需要一个NIO学习入门文章来指导,这篇文章是我看到关于NIO最好入门demo,甚至可以在此基础上,加以改造。
3 Tip
当我们不得不在页面上,查看某url返回的json字符串是否正确的时候,很多时候,都要把json字符串复制到字符串校验器上,这就增加了工作量,这时候,我们可以在chrome浏览器下载个JSONView插件,这个插件可以很轻松的在json页面上,帮你格式化,并校验json字符串格式是否正确。
4 Share
关于Spring源码阅读,如果你要问我,如何阅读源码,我的建议是先找本源码书,老老实实跟着书籍,从最原始的地方写main方法,调用ClassPathXmlApplicationContext一步步调用进去,过程中要善于借助idea编辑工具的各种视图软件,查看调用堆栈和过程。Spring的两大核心IOC和AOP,我认为是必须要掌握的。只有理解了IOC的基本原理,在后面面对Spring框架的开发中,才能针对容器中的各种bean进行更好的管理,在这部分,我认为在IOC容器源码篇,更多的是学习到设计模式的实际应用精髓,如工厂模式,设配器模式等等;了解AOP的原理,才能对后面系统如何对特定的类进行编织处理,其中又涉及到CGLib动态代理,还有jdk动态代理。
这里贴段当时学习IOC的一个小笔记,如有不对的地方,望不吝赐教。
“最近看了Spring相关的内容,以前以为Spring IOC容器管理的对象是直接以Object对象在内存中进行管理的,谁知道不是,对象并不一开始就以Object存在,而是以一个BeanDefinition的实例对象存在于Factory中的Map中,BeanDefinition实例对象持有的是具体对象的信息,包括类名,容器名称,容器的父容器等,在获取具体对象的过程中,就使用了反射的方式实例化对象,假如对象的作用域是singleton(单例)的话,就直接把对象存放于具体对象的Map中进行维护。
BeanDefinition在IOC存在,给我感觉相当持有了一个对象的快照,持有快照便可以快速复制,生成新的实例对象。
BeanDefinition的存在,使我联想到Spring cloud中服务之间注册的模块的EurekaServer中InstanceInfo类存在,只不过前者存放一些类的相关信息,后者存放的是一个服务节点的信息(URL,端口,服务实例名称)
”
浙公网安备 33010602011771号