
算法与数据结构设计
文章平均质量分 82
由此及彼
代码可以更优雅。
展开
-
项目实战:封装友盟,数据化监控应用
《从理论到实践,埋点专车费用明细模块》在简书首页、人人都是产品经理等各大媒体取得了不错的反响。正所谓授人以鱼不如授人以渔。今天我们从代码层面进行埋点实现,引入友盟并进行封装,然后视具体规划埋点,数据化监控我们的应用,数据分析,Go。首先,参考官方文档申请key,添加权限,进行一系列准备操作。耐心花10~30 min 都看一遍哈。友盟统计分析Android文档http://dev原创 2017-06-01 16:58:09 · 818 阅读 · 0 评论 -
算法优解(7)-相加链表
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和输出操作,将这道题完善成了一个小Demo,和各位共勉。 题目:两个单链表生成相加链表:假设链表中的每一节点的值都在0-9之间,于是我们可以使用整个链表作为一个整数。 例如:链表9->3->7(代表整数937)和链表6->3(代表整数63)相加后得到链表1->0->0->0(代表整数1000)。思路:利用栈结原创 2016-11-14 20:57:38 · 296 阅读 · 0 评论 -
项目实战:说一说运算符优先级和代码可读性
拿我们项目中的一行代码说事,说一说运算符优先级和代码可读性问题。请大家看一下这一行代码表达的意思和可能出现的问题,请忽略它的业务意义哈。 dto.getStatus() ==1? false :true|| imageDto == null写这行代码的人的初衷是:(dto.getStatus() ==1? false :true)||(imageDto == null)原创 2016-11-17 20:36:02 · 487 阅读 · 0 评论 -
JavaSE-String API compareTo源代码分析
曾记否我们在JavaSE-String API 其他功能接触的compareTo,今天我们深入源代码一探究竟。请看这样一段代码:public class CompareToTest { /** * 权兴权意-2016.11.17 * JavaSE-String API compareTo源代码分析 */ public static void main(String[] a原创 2016-11-17 14:47:30 · 422 阅读 · 0 评论 -
Android TextUtils那些事(isEmpty()的误解)
我们经常使用TextUtils.isEmpty()来判断字符串是否为空,有很多人认为空格也能返回true,然而空格不等于空!此外,isEmpty还能判断字符串长度是否为0。请看源码: /** * Returns true if the string is null or 0-length. * @param str the string to be examine原创 2016-11-14 11:27:07 · 2321 阅读 · 0 评论 -
算法优解(9)-单链表的选择排序
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和打印操作,将这道题完善成了一个小Demo,和各位共勉。题目:给定一个无序单链表的头结点head,实现单链表的选择排序。要求额外空间复杂度O(1)。思路:从未排序链表中找到最小节点small的前一节点smallPre,从而在未排序链表中删除最小节点small,并将最小节点small添加到已排序链表中,由此逐渐原创 2016-11-16 19:43:17 · 889 阅读 · 0 评论 -
深入浅出Android消息机制的原理(示意图和源码)
Android系统中的视图组件并不是线程安全的,如果要更新视图,必须在主线程中更新。因此,我们通过Handler在子线程中通知主线程,让主线程做更新操作。这个过程中消息机制起着重要的作用。下面,我们就来分析一下Android中的消息机制。熟悉Windows编程的朋友知道Windows程序是消息驱动的,并且有全局的消息循环系统。Google参考了Windows的消息循环机制,也在An原创 2016-10-31 14:16:13 · 391 阅读 · 0 评论 -
JavaSE-3min回顾Object的finalize和clone方法
JavaSE基础学习,今天我们花3min回顾一下Object的finalize和clone方法。 先回顾finalize,看最好的教材,官方API文档:finalizeprotected void finalize() throws Throwable当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写fina原创 2016-11-11 11:55:51 · 278 阅读 · 0 评论 -
Java实现二叉树的构建以及3种遍历方法
对二叉树的构建及遍历一直耿耿于怀,今天又遇见这个问题了,所以花了一下午的时间来编写代码以及介绍思路的文档生成! 首先介绍树的构建方法,把一个数组的值赋值给一棵二叉树,然后附上具体的代码实现。1.树的构建方法 2.具体代码 package tree; import java.util.LinkedList; impo转载 2016-10-08 19:26:33 · 504 阅读 · 0 评论 -
算法优解(8)-删除无序单链表中重复出现的节点
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建操作,将这道题完善成了一个小Demo,和各位共勉。 问题:删除无序单链表中重复出现的节点思路:使用HashSet进行重复判断。核心算法: public static void removeNode(Node head){ if(head == null){ return; } HashSet s原创 2016-11-15 19:42:26 · 505 阅读 · 0 评论 -
算法优解(10)-合并两个有序的单链表
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和打印操作,将这道题完善成了一个小Demo,和各位共勉。题目:合并两个有序的单链表。思路:逐一比较两个链表的节点将其合并到其中一个链表。核心算法: public static Node merge(Node head1,Node head2){ if(head1 == null ||原创 2016-11-21 19:30:12 · 357 阅读 · 0 评论 -
算法优解(11)-二叉树的序列化和反序列化
来自左神书中的一道题,在左神核心代码的基础上,添加了二叉树的构建和前序遍历操作,将这道题完善成了一个小Demo,和各位共勉。题目:二叉树的序列化和反序列化。名词解释:* 二叉树的序列化:二叉树被记录成文件* 二叉树的反序列化:通过文件重建二叉树思路:我们通过先序遍历实现序列化,假设序列化的结果字符串为str,初识为"",先序遍历二叉树,如果遇到null节点就在s原创 2016-11-22 19:49:29 · 451 阅读 · 0 评论 -
项目实战:关于format(String)你不知道的那些事
在项目中有一种很常见的case就是字符串拼接,以我们专车下单页的企业规则校验场景为例,如图,我们来分析这一句提示文案:立即叫车服务不符合企业用车规则,无法用车它是由两部分组成,动态的当前服务类型(立即叫车)+静态的固定文案(服务不符合企业用车规则,无法用车)。因为我们现在有很多服务类型(立即叫车、预约用车、日租、半日租、接机、送机、定制···),我们需要根据用户选择的服务类原创 2017-03-16 11:36:27 · 549 阅读 · 0 评论 -
项目实战:超实用小工具isFastClick解决重复点击按钮问题
相信大家在项目开发中都遇到过这种case,点击按钮时,由于手机一时卡顿或者手速过快,造成按钮重复多次点击,跳转生成多个Activity(然后一个个关)或者其他重复操作。现在,就让我们通过几行代码一劳永逸的解决它。小工具的核心思想就是借助System.currentTimeMillis()计算多次点击按钮的时间差,如果这个时间差很小,我们就认为这是无效的重复点击。封装一个Utils工原创 2017-04-01 13:46:31 · 1709 阅读 · 0 评论 -
项目实战:几十行代码实现更加强大的Log,全方位输出类-方法-行数-信息
在项目开发中,我们经常使用Log帮助我们调试代码。但是,Log可以更加强大。在这里我对Log进行封装,借助StackTraceElement类,几十行代码实现更加强大的Log,全方位输出类-方法-行数-内容。我们先看一下Android的Log: /** * Send a {@link #DEBUG} log message. * @param tag Used t原创 2017-03-22 19:19:26 · 849 阅读 · 0 评论 -
项目实战:滚动刷新场景(从ArrayList到LinkedList)
如果有这样一个需求,有这样一个列表显示数据,现假设一共显示25项,初始状态为空。首先从0-24添加数据,满了之后,覆盖最早数据,即继续从0-24追加数据。习惯性思维ArrayList开始搞。java.util 类 ArrayListjava.lang.Object java.util.AbstractCollection java.util.Abstra原创 2016-09-20 17:16:35 · 4017 阅读 · 6 评论 -
一个登录Demo初识MVP
从我们的项目到招聘网站的JD,处处可见Android MVP 模式的身影。项目越来越庞大,开发越来越多,MVP的优势越来越明显。今天我们通过一个简单的登录Demo,初步学会MVP的使用。首先,什么是MVP?MVP模式是MVC模式在Android上的一种变体,要介绍MVP就得先介绍MVC。在MVC模式中,Activity应该是属于View这一层。而实质上,它既承担了V原创 2017-03-08 16:20:45 · 458 阅读 · 0 评论 -
项目实战:借鉴Android API源码(Splitter-split和TextView-setText),不惧NullPointerException(文末彩蛋)
NullPointerException空指针异常可以说是我们开发中最常遇到的Bug,因此我们处处判空,胆战心惊。处处判空确实可以解决空指针异常的Crash。但处处判空未免过于草木皆兵,而且写出来的代码十分不优雅,多余判断效率低下,这不是我们的Style!这里,我们由点到面,借鉴一下Android API中Splitter类的split方法和TextView类的setText方法,我们原创 2017-02-06 15:36:50 · 1167 阅读 · 0 评论 -
项目实战:WindowManager中removeView的那些坑-随心所欲removeView
正所谓没有遇到过类似于not attached to window manager、Android removeView view must not be null的开发者不是好工程师,今天我们就来看看WindowManager中removeView的那些坑。其实也没必要细说它有多坑,只要避过这些坑即可。经过这一段时间的项目开发,小结一条真理:不要在像Activity这样有生命周期的东原创 2016-09-19 19:51:28 · 11717 阅读 · 4 评论 -
算法之美:取球游戏
前言:在编程问题中,取球游戏的一般解题模板伪代码: f(局面x){//——>胜(true)负(false) 边界条件处理。。。。。 For(我所有可能的走法){ 试着走一步——>局面y 胜负t = f(y);转载 2017-01-03 13:59:45 · 1472 阅读 · 0 评论 -
一道折半算法变种的面试题
经验之谈:当你看到排好序、查找、logN等字眼时,请第一时间想到折半。一个排好序的整型数组,然后把数组中的元素循环左移若干位置。编程实现一种在新的数组中查找某个指定值的算法。要求时间复杂度为O(logN)。比如原数组是[1,4,9,10,15,16]循环左移2个位置得到[9,10,15,16,1,4]元素:15偏移量:2位置:4->2直接看核心算法,做一下边原创 2016-10-08 14:54:07 · 306 阅读 · 0 评论 -
cache和files目录的区别
在10min实现一个简易图片查看器(图片缓存)中我们使用到了Cache缓存。那么cache和files目录究竟有什么区别呢?今天我们一起来探索一下。1.写好布局文件,2个Button分别绑定2个click事件,实现cache和files: <Button android:onClick="clickCache" android:layout_width原创 2016-11-11 14:45:48 · 3787 阅读 · 0 评论 -
算法优解(3)-栈栈排序
来自左神书中的一道题,不过左神的Java代码有一点小问题,排序排反了,大于号改成小于号就ok,自己亲自Coding实现了一遍,麻烦小伙伴们帮忙转转,让左神下一版时能纠正这个错误,另,转载请注明出处哈。题目:一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。 分析:题目不难,直接上代码,里面有用例原创 2016-09-28 14:06:37 · 365 阅读 · 0 评论 -
算法优解(2)-猫狗队列
来自左神书中的一道题,不过左神的Java代码有几个问题,自己亲自Coding实现了一遍,麻烦小伙伴们帮忙转转,让左神下一版时能纠正这个错误,另,转载请注明出处哈。题目:已知有宠物、狗、猫类如下,实现一种猫狗队列的结构,要求实现add、pollAll、pollDog、pollCat、isEmpty、isDogEmpty、isCatEmpty等方法。class Pet { private原创 2016-09-27 14:22:36 · 1093 阅读 · 1 评论 -
你不知道的TextView实现原理
在前面一个系列的文章中,我们以窗口为单位,分析了WindowManagerService服务的实现。同时,在再前面一个系列的文章中,我们又分析了窗口的组成。简单来说,窗口就是由一系列的视图按照一定的布局组织起来的。实际上,每一个视图都是一个控件,这些控制可以将自己的UI绘制在窗口的绘图表面上,同时还可以与用户进行交互,即获得用户的键盘或者触摸屏输入。在本文中,我们就详细分析窗口控件的上述实现原理。转载 2016-09-27 09:56:43 · 521 阅读 · 0 评论 -
项目实战:RequestUrl的处理(思考 + Sting API > KMP等复杂算法、正则表达式)
今天从项目中抽取了一个点进行分析,大概情形就是在项目中我们请求了大量参数,想非常直观的从这些参数中挑出一些特定信息并将它显示出来,这就涉及到了字符串的处理。例如给定这样一个requestUrl:private static String requestUrl = "http://xxxtest.11111111.com:9988" + "/resource/x/xxx/xxxsup原创 2016-09-26 11:39:00 · 539 阅读 · 0 评论 -
算法之乐:一个算法解决3道经典二叉树面试题(深度、长度、直径)
有了昨天《Java实现二叉树的构建以及3种遍历方法》的二叉树数据结构基础,今天我们通过一个算法解决3道关于二叉树的经典面试题(深度、长度、直径),触类旁通,举一反三,尽享算法之乐。测试二叉树:例题:给定一个二叉树,计算它的最大深度。深度是指根节点到子节点路径中的节点个数。如图,1->8/9的深度为4(1-2-4-8/9),这也是这棵二叉树的最大深度。我们定义一个Result原创 2016-10-09 14:59:26 · 973 阅读 · 0 评论 -
5种方法巧妙交换变量值
今天我们看一道十分经典的面试题,交换2个整数变量的值。在算法竞赛中,最简单粗暴的方法:System.out.println("a:" + b + ",b:" + a);在开发中,最常用的方法: int c; c = a; a = b; b = c;在面试中,这里提供3种解法:法一-位运算: a = a^b; b = a^b;//a^b ^ b原创 2016-09-18 19:42:39 · 493 阅读 · 0 评论 -
算法优解(1)-图文并茂详解getMin栈
题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。要求:1、pop、push、getMin操作的时间复杂度都是O(1) ;2、设计的栈类型可以输用现成的栈结构。思路:在设计上我们使用两个栈,一个栈用来保存当前栈中的元素,其功能和一个正常的栈没有区别,这个栈记为stackData;另一个栈用于保存每一步的最小值,这个栈记原创 2016-09-03 20:08:15 · 380 阅读 · 0 评论 -
OFFER(1)-图文并茂详解二进制中1的个数
题目:请实现一个函数,输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,其二进制表示为1010,有两个1,因此输出2。思路:这是一道很基本的考查位运算的面试题。一个很基本的想法是,我们先判断整数的最右边一位是不是1。接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次 移动一位,直到这个整数变成0为止。现在的问题变成怎样判断一个整原创 2016-09-04 17:28:43 · 329 阅读 · 0 评论 -
深入浅出UML类图
在UML 2.0的13种图形中,类图是使用频率最高的UML图之一。Martin Fowler在其著作《UML Distilled: A Brief Guide to the Standard Object Modeling Language, Third Edition》(《UML精粹:标准对象建模语言简明指南(第3版)》)中有这么一段:“If someone were to come up转载 2016-10-25 17:34:28 · 299 阅读 · 0 评论 -
一道简单的String面试题-找出非连续成对出现的一个字母(临界情况)
给定一个字符串数组,所有字母都连续成对出现除了一个字母,找出该字母。例子:[AABBCCDEEFFGG], 答案: D秒写简单算法,注意边界条件,遍历即可: private static char findSingleCharacter1(char[] input, int n) { int i; for (i = 0; i < n - 2; i =原创 2016-09-29 10:56:11 · 621 阅读 · 0 评论 -
LeetCode上一道经典的面试题-O(1)实现LRU Cache
你遇到过这个题吗?实现一个LRU Cache。要求查询和插入都在O(1) 时间内完成。遇到过?很正常。没遇到?早晚会遇到。(鬼脸)这是LeetCode上一道十分经典的题目,也是非常火的面试题。原题:Design and implement a data structure for Least Recently Used (LRU) cache. It sho原创 2016-09-30 11:04:23 · 10380 阅读 · 0 评论 -
算法优解(6)-反转单向链表
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和输出操作,将这道题完善成了一个小Demo,和各位共勉。 题目:* 反转单向链表这道题太常见了,必知必会。核心算法: public static Node reverseList(Node head){ Node pre = null; Node next = null; while(head !=原创 2016-11-10 19:21:47 · 392 阅读 · 0 评论 -
JavaSE-3min回顾并优化Object的equals方法
JavaSE基础学习,今天我们花3min回顾一下Object的equals方法并对equals方法进行优化。先看最好的教材,官方API文档:equalspublic boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。equals 方法在非空对象引用上实现相等关系: 自反性:对于任何非空引用值 x,x.equals(x) 都应返原创 2016-11-10 16:07:51 · 269 阅读 · 0 评论 -
算法优解(5)-删除单链表的倒数第k个节点
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和输出以及删除节点的打印,将这道题完善成了一个小Demo,和各位共勉。题目:* 给定一个单链表,删除它的倒数第k个节点。* 例如给定链表: 1→2→3→4→5,删除它的倒数第二个节点后变为 1→2→3→5。方法:* 第一种方法,就是先对单链表进行进行一次遍历,求出其长度n。然后再进行第二次遍历,设一个指针原创 2016-11-09 19:54:18 · 1062 阅读 · 0 评论 -
10min实现一个简易图片查看器(图片缓存)
在昨天简易图片查看器的基础上,我们进一步完善Demo,实现图片缓存功能。通过httpURLConnection.getInputStream()获取网络请求得到的输入流: InputStream inputStream = httpURLConnection.getInputStream();我们在CacheDir下新建一原创 2016-11-09 16:41:45 · 427 阅读 · 0 评论 -
算法优解(4)-有序链表公共部分
来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建和输出,将这道题完善成了一个小Demo,和各位共勉。题目:* 给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。因为是有序链表,链表对应遍历比较即可,题目比较简单,看代码:我们先定义一个节点类,包括自身的值和指向下一个节点的引用,以及一个构造函数为自身赋值。class Node{原创 2016-11-08 19:52:44 · 391 阅读 · 0 评论 -
Java字符串拼接那些事
关于Java字符串拼接,你一般用哪种方法?+还是StringBuilder?使用+来拼接字符串,使用javap命令来反编译代码,可以看出实际上编译器会自动创建StringBuilder,调用它的append方法来拼接字符串。如果在一个for循环语句中,循环100次,使用+来拼接字符串的话,就会创建100次StringBuilder对象,这样就很消耗内存,所以,在进行复杂字符串拼接的时候原创 2016-10-17 13:55:52 · 472 阅读 · 0 评论 -
Java字符串拼接效率分析及最佳实践
java连接字符串有多种方式,比如+操作符,StringBuilder.append方法,这些方法各有什么优劣(可以适当说明各种方式的实现细节)?按照高效的原则,那么java中字符串连接的最佳实践是什么?有关字符串处理,都有哪些其他的最佳实践?废话不多说,直接开始, 环境如下:JDK版本: 1.8.0_65CPU: i7 4790内存: 16G转载 2016-10-17 13:51:36 · 386 阅读 · 0 评论