ARST挑战 第1周

   这次是开始执行ARTS的第一周,说来真是惭愧,虽然大学读的是计算机本专业,但是大学四年里面,只着重开发工具的熟练,却忘记的勤修内功。出来工作之后,才知道这些东西的宝贵,也懂得了,以为最快的捷径,却发现是走的最慢的,所以参加了由左耳朵耗子发起的ARTS挑战,目的为了提高技术深度之外,也是为了一步步杜绝自己眼高手低的做法。无论时间长短,都从最简单的开始做起,一来查漏补缺,二来可以巩固知识,现在开始第一周的挑战。
 
1 Algorithm
977. Squares of a Sorted Array
Given 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,端口,服务实例名称)
posted @ 2019-03-22 10:48  RealCoding  阅读(135)  评论(0)    收藏  举报