美文网首页
ARTS Week 03

ARTS Week 03

作者: dotdotdotdotbar | 来源:发表于2019-04-07 11:41 被阅读0次

Algorithm

905. 按奇偶排序数组

题目

给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。

思路

这个题目主要时要把数组分为奇偶两部分,和快排中分割元素的思想一致,因此可以使用快排分割元素的思想。也就是设置两个变量i、j,初始为零,用j从前往后遍历数组,如果遇到偶数,就把i、j交换位置,将偶数换到前面,然后i加1,最后就能得到一个偶数在前,奇数在后的数组。

实现

func sortArrayByParity(A []int) []int {
    if A == nil || len(A) == 0 {
        return A
    }
    
    for i, j := 0, -1; i < len(A); i++ {
        if A[i]%2 == 0 {
            j++
            A[i], A[j] = A[j], A[i]
        }
    }
    return A
}

Review

Goodbye, Object Oriented Programming
这篇文章通篇都在分析面向对象编程方式的缺点,作者从oop的三大特性着手分析,继承、封装和多态。
首先呢,是对继承进行分析,这也是作者分析的最为详细的部分,从四个角度进行论证:

  1. 针对继承的重用性,为了复用一个当前继承体系中已有的类,不得不把它的父类、父类依赖的类都一起添加进来,可以使用组合和代理解决这个问题。
  2. 针对多继承的分析,就是说当一个类继承了两个具有相同父类的类时会造成的问题,这同样也使用组合和代理解决。
  3. 当父类修改逻辑可能会造成子类的行为异常,同样,也是用组合及代理进行解决。
  4. 作者认为继承的层次结构和现实生活中的模型并不一致,现实中很多的模型都是包含的关系,而非继承关系,因此作者认为应该使用组合的思想,而非继承的思想来对层次结构进行划分。
    接着,作者对封装进行分析,他认为封装并不安全,因为封装的只是外部传来的对象引用,外部依然能够对这个对象进行修改,这样有违封装的本意,要做到安全的话智能对对象进行深拷贝,但这样也会有问题。
    然后,作者认为完全可以使用基于接口的多态替代基于继承的多态。
    在最后,作者建议使用函数式编程。
    我觉得作者其实主要还是对于继承深恶痛绝的,因为对于继承的缺点,举了挺多的例子,同时对于封装的多态的缺点,只能算是一笔带过了。但是感觉作者的观点似乎不完全正确。
    作者说当他想复用一个已有的类到新项目中时,要把它的父类、父类依赖的类都导过去,导致的结果就是,本来只想要一根香蕉,却得到了整篇森林。以此来抨击继承,然后推荐用组合或者代理去实现,但是这样的继承结构是不是本来就不合理?想要复用这样的它,肯定会有问题。还有作者举得例子都不是很有说服力,因为不管是函数式编程也好,面向对象编程也好,总是不可能说完全按照理想的状态来的,根据不同的语言总会有不同的需要注意的点,只能说都会面对不同的问题。
    不过我觉得不管是面向对象编程还是函数式编程,在介绍理念的时候都是使用非常简单而直白的例子来讲解的,但只有在体验过各种错综复杂的需求、场景之后才能真正的有所领悟吧。不过也许函数式编程真的更容易实现优雅的代码,大概作者是深有体会才会写这样一篇文章,还真是想要去了解一下。

Tip

这周了解了一下怎么用MAT分析安卓应用内存,这里介绍一下吧。
先打开android studio的profile

image.png
选择memory,进入内存详情界面
image.png
然后先点上方的删除按钮触发GC,之后在点下载按钮抓取heap dump文件
image.png
image.png
然后把heap dump文件保存下来。
image.png
这时会生成一个hprof文件。但是这个文件还不能直接用MAT打开,需要用安卓的hprof-conv工具转换一下,
image.png
接下去就可以用MAT打开这个文件了,MAT的下载链接:https://www.eclipse.org/mat/downloads.php
打开后就看到如下界面,这样就可以开始分析内存了
image.png

Share

Glide图片加载基本流程

相关文章

  • ARTS Week 03

    Algorithm 905. 按奇偶排序数组 题目 给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的...

  • ARTS Week 1

    Algorithm: Problem: Reorder Log FilesAnswer: Review: (Not...

  • ARTS Week 01

    Algorithm 题目 977. 有序数组的平方给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的...

  • ARTS Week 02

    Algorithm 832. 翻转图像 题目 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果...

  • ARTS Week 06

    Algorithm 1021. 删除最外层的括号 有效括号字符串为空 ("")、"(" + A + ")" 或 A...

  • ARTS Week 04

    Algorithm 题目 922. 按奇偶排序数组 II 给定一个非负整数数组 A, A 中一半整数是奇数,一半整...

  • ARTS Week 05

    Algorithm 题目 771. 宝石与石头 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。...

  • 哈利波特与魔法石:Week 03 Day 03_Chapter

    Week 03 Day 03 (…an’ you was only a baby, an’ you lived.)...

  • 哈利波特与魔法石:Week 02 Day 03_Chapter

    Week 02 Day 03 (Chapter 03 From the begining…'Marge's ill...

  • ARTS-Week0

    每周完成一次 ARTS 编程挑战,坚持做有积累效应的事情。Algorithm:每周至少做一道 [LeetCode...

网友评论

      本文标题:ARTS Week 03

      本文链接:https://www.haomeiwen.com/subject/qdvdiqtx.html