LeetCode 随机 - 两两交换链表中的节点 24. 两两交换链表中的节点给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.代码/** * Definition for singly-linked list. * public class ListNo...
LeetCode 随机 - Z 字形变换 6. Z 字形变换将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:L C I RE T O E S I I GE D H N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。请你实现这个将字符串进行指定...
LeetCode 随机 - 全排列 II 47. 全排列 II给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]输出:[ [1,1,2], [1,2,1], [2,1,1]]代码class Solution { public static List<List<Integer>> permuteUnique(int[] nums) { ...
LeetCode 高级 - Remove Invalid Parentheses Remove Invalid Parentheses删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。说明: 输入可能包含了除 ( 和 ) 以外的字符。示例 1:输入: "()())()"输出: ["()()()", "(())()"]示例 2:输入: "(a)())()"输出: ["(a)()()", "(a())()"]示例 3:
Java 之路 (二十) -- Java I/O 上(BIO、文件、数据流、如何选择I/O流、典型用例) 前言Java 的 I/O 类库使用 流 这个抽象概念,代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。流 屏蔽了实际的 I/O 设备中处理数据的细节。数据流是一串连续不断的数据的集合,简单理解的话,我们可以把 Java 数据流当作是 管道里的水流。我们只从一端供水(输入流),而另一端出水(输出流)。对输入端而言,只关心如何写入数据,一次整体全部输入还是分段输入等;对于输...
Java 之路 (十九) -- 注解(语法、预定义注解、元注解、重复注解、注解与反射) 前言官方注解的定义如下: 注解(一种元数据形式)提供有关不属于程序本身的程序的数据。注解对它们注解的代码的操作没有直接影响。 注解有许多用途,其中包括: 编译器的信息 - 编译器可以使用注解来检测错误或抑制警告。 编译时和部署时处理 - 软件工具可以处理注解信息以生成代码,XML文件等。 运行时处理 - 可以在运行时检查某些注解。 第一次看时...
Java 之路 (十八) -- 容器深入研究(容器接口,实现类特性及对比) 1. 接口首先,放上层次图(少了Queue)。 Collection 继承了 Iterator 接口(事实上,该接口是所有集合的总接口),定义了集合的遍历操作。前面我们已经介绍过集合类的基础知识,这里就简单回顾以下:**Collection:**Collection 是一个接口,没有直接实现类。它用来传递集合并在需要最大通用性时对其进行操作。List:有序集合(或称为序列)...
Java 之路 (十七) -- 数组(基本概念与使用、数组与泛型、数组操作、Arrays 类) 学完复杂的泛型,来学点简单的。本文介绍 Java 数组的相关知识。1. 基本概念数组是一个容器对象,它包含固定数量的单个类型的值。&nbsp;创建数组时,将建立数组的长度。&nbsp;创建后,其长度是固定的。 数组中的每个项成为元素,每个元素由其数组索引访问。举个简单例子:class ArrayDemo { public static void main...
Java 之路 (十六) -- 泛型下(通配符、类型擦除、泛型的限制) 7. 通配符通配符,即 “?”,用来表示未知类型。通配符可用作各种情况:作为参数,字段或局部变量的类型;有时也作为返回类型;通配符从不用作泛型方法调用、泛型类实例创建或超类型的类型参数。7.1 上限有界的通配符使用上限通配符来放宽对变量的限制。声明上限通配符的语法:&lt;? extends 上限&gt;举个例子:public static double sum...
Java 之路 (十五) -- 泛型上(泛型类、泛型方法、有界类型参数、泛型与继承、类型推断) Thinking in Java 中关于泛型的讲解篇幅实在过长,前后尝试阅读这一章,但总是觉得找不到要点,很迷。于是放弃 Thinking in Java 泛型一章的阅读,转而官方教程,本章可以算作官方教程的中文版。 放上官方教程地址: The Java™ Tutorials - Generics1.为什么使用泛型简单来说,泛型使类型在定义类、接口和方法时成为参...
Java 之路 (十四) -- 类型信息(RTTI、Class 对象的加载、Class 引用的获取与泛化、instanceof 关键字、反射基础与简单使用示例) 学习内容:传统的 RTTI Class 对象的加载获取 Class 对象引用的方式ClassforName类字面常量Class 引用的泛化instanceof 关键字反射 相关类简单使用示例前言运行时类型信息使得我们可以在程序运行时发现和使用类型信息,Java 中运行时识别对象和类的信息有如下两种方式: 传统的 RTTI :假定我们在编译时已经知道所有...
Java 之路 (十三) -- 字符串(String、正则表达式) 个人吐槽:对于这章,第一遍读和重读之后果然看法不同:第一次读时觉得,文章用了大篇幅来介绍 API,这样我可以比较容易理解这个方法是干嘛的,以此理解这个类是干嘛的;但是重读之后觉得,文章居然用了这么大篇幅在讲 API(尤其是正则表达式),如果我需要知道具体某个方法怎么用,直接去官方文档查多好啊,这种情况下,我更希望得到某个方法可能出现的坑,而不只是方法的介绍(毕竟,这往往需要踩过坑之后总结的,...
Java 之路 (十二) -- 异常(基本常识、try-catch-finally、throw、throws、使用指南) Java 的基本理念是 “结构不佳的代码不能运行”错误回复在我们编写的每个程序中都是基本的元素Java 的主要目标之一是创建供他人使用的程序构件Java 的异常处理的目的在于通过使用少于目前数量的代码来简化大型、可靠的程序的生成,并且通过这种方式可以使你更加自信:你的应用中没有未处理的错误1. 初识异常正式介绍异常之前,先来看一个例子:public static vo...
Java 之路 (十一) -- 持有对象(Collection、List、Set、Queue、Map、Iterator、foreach) 本章将简单介绍一下常用的集合类的特点,同时并不会深入源码分析原理,本文目的仅仅在于对 Java 集合类有一个整体认识关于 API,本文不涉及过多,建议直接查看 Java 官方文档 https://docs.oracle.com/javase/9/docs/api/overview-summary.html1. 容器概述1.1 引入原因Java 中,数组用来保存...
Java 之路 (十) -- 内部类(概念、分类、特性、意义、"多重继承"、继承) 1. 内部类基础1.1 什么是内部类内部类的定义如下:可以将一个类的定义放在另一个类的定义内部,这就是内部类更具体一点,对于编程思想而言:内部类允许将逻辑相关的类组织在一起,并控制位于内部的类的可视性。内部类就像是一种代码隐藏机制:将类置于其他类的内部,它了解外围类,能与之通信1.2 内部类的分类内部类分为以下四类:成员内部类:最最普通的内部类,...
Java 之路 (九) -- 接口(抽象类方法、接口、多重继承、接口与解耦等) 我们前面学过通过“隐藏实现”可以将接口与实现分离,然而它仅仅作为基础,而本章的接口以及下一章的内部类 为我们提供了一种将接口和实现分离的更加结构化的方法。话不多说,进入正题。1. 抽象类和抽象方法 抽象类是普通的类与接口之间的一种中庸之道。1.1 什么是抽象类/方法抽象方法定义:指的是一些只有方法声明,而没有具体方法体的方法。声明语法:通过 abstr...
Java 之路 (八) -- 多态(向上转型、多态、绑定、构造器与多态、再再谈初始化和类的加载、协变返回类型、向下转型) 多态 是继 数据抽象 和 继承 之后的第三种基本特征。 多态也称作动态绑定、后期绑定或运行时绑定。 多态的一些具象表现。 允许不同类的对象对同一消息做出响应 同一个行为具有多个不同表现形式或形态的能力 只有在运行时才会知道引用变量所指向的具体实例对象 封装:通过合并特征和行为创建新的数据类型。 实现隐藏:通过将细节私有化,把接口和实现分离开来 多态...
Java 之路 (七) -- 复用类(组合、继承、代理、向上转型、final、再谈初始化和类的加载、方法覆盖) 学习内容两种代码复用机制 - 组合 &amp; 继承 以及中庸之道 - 代理组合 和 继承 如何选择使用如何结合使用向上转型final 关键字1. 组合1.1 组合的概念 在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成,所以这种方法成为组合。1.1.1 组合的写法及样例只需要在当前类中声明另一个类的对象作为其成员变量即可,...
Java 之路 (六) -- 访问权限控制(Package、Public、protected、friendly、private) 这一章内容比较少,也比较基础。不多废话,下面开始这一章的学习吧。学习内容包 package访问权限 public、protected、默认、private1. Package(1) 原因:为了更好的组织类,Java 提供了包机制,用来区别类名的命名空间。(2) 包的作用:利用操作系统的层次化的文件结构,将特定包的 .class 文件都置于一个目录下。...
Java 之路 (五) -- 初始化和清理(构造器与初始化、方法重载、this、垃圾回收器、枚举类型) 学习内容:构造器方法重载this 关键字垃圾回收器的清理初始化问题枚举类型这一章内容有一点点多,需要注意的地方也很多。下面就开始我的表演了。1. 构造器(1) 概念:一个创建对象时被自动调用的特殊方法。(2) 作用:通过构造器,创建对象,并确保对象得到初始化。(3) 命名:构造器的名称必须与类名相同。(4) 特殊:构造...
Java 之路 (四) -- 控制执行流程 学习内容流程控制语句关键字:if-else、while、do-while、for、return、break、switchJava 使用了 C 中的全部流程控制语句,这一章也属于比较基础的,所以也是基础点到即止,坑点重点强调。1. 条件的判别这部分为这一章的大前提,需要清楚掌握,否则会掉进坑里。(1) 所有条件语句通过条件表达式的真或假来决定执行的路径,我们上一章讲...
Java 之路 (三) -- 操作符 发个牢骚,最近看 《Thinking in Java》,不知道是不是我的错觉,总觉得里面写的知识虽然很循序渐进,但是总是很散乱,对每个知识点没有总结性质的叙述。大概这就是我太菜了吧。 另外,我总是在途中下意识以为,我写这篇文章是给彻头彻尾的小白看的。但是其实不是,我只是记录书中的知识点,学习之余复习罢了。告诫自己,我的初衷是什么。学习内容:操作符的使用 及一些 易错点 (这里...
Android - Retorfit 2 使用详解 本文中使用 Retrofit 2.3.0 版本 侧重于如何使用,至于原理暂不考虑。面临秋招的准大四狗,看了看各大公司的面经,什么 Retrofit、RxJava,还有一众图片加载库 比如 Glide、Picasso 等等都快成了标配了,动辄分析其源码。原来一直以自己入门尚短为由拖沓没去了解这些开源库(实际上可以算作是18年年初才开始接触),现在不得不学习这戏开源库了。于是...
Java 之路 (二) -- 一切都是对象 本章学习内容Java 程序的基本组成部分核心:理解 Java 中(几乎)一切都是对象。Java 是 混合型语言1. 引用操纵对象Java 中通过操纵对象的 “引用” 来操纵内存中的元素。可以理解为通过遥控器(引用)操纵电视(对象),只要握住遥控器,就能保持和电视的连接。同时通过操控遥控器(引用)来简介操控电视(引用)。另外,即使没有电视,遥控器也可单独存在,也就是说...
Java 之路 (一) -- 对象导论 写在开篇作为计划中的 java 学习系列的第一篇,说一点废话。最开始学习 java 还是在大二下学期学校开的课,然而在那之后并未深入学习,相当多的知识要么遗忘掉了,要么就还是属于一知半解的程度。而自从今年接触 Android 以来,越发的感受到 java 基础的重要性,不只是 API 的熟练程度,最重要的是一些思想总是理解不到位。于是乎,趁现在大四前(秋招前)的最后一个暑假,重新学一下...
LeetCode 高级 - LRU 缓存机制 LRU 缓存机制运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据...
Android 开发艺术探索笔记之十二 -- Bitmap 的加载和 Cache 学习内容:如何有效加载 BitmapAndroid 常用的缓存策略 LurChche - 内存缓存DiskLurCache - 存储缓存优化列表的卡顿现象1. Bitmap 的高效加载如何加载图片?四类方法:BitmapFactory.decodeFile / decodeResource / decodeStream / decodeByteArra...
Android 开发艺术探索笔记之八 -- 理解 Window 和 WindowManager 写在最前:本文涉及到源码的部分,查看的是 Android 8.1.0_r33 的源码,部分与原文中代码有出入。附上查看源码的网址:http://androidxref.com/学习内容:Window 和 WindowManagerWindow 的内部工作原理 Window 的添加、更新和删除Actvitiy、Dialog 等类型的 Window 对象的创建过程原...
LeetCode 高级 - 单词拆分 II 单词拆分 II给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。说明:分隔时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入:s = "catsanddog"wordDict = ["cat", "cats", "and", "san...
LeetCode 高级 - 通配符匹配 通配符匹配给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。示例 1:输入:s = ...
LeetCode 高级 - 分割回文串 分割回文串给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:输入: "aab"输出:[ ["aa","b"], ["a","a","b"]]分析解题思路就是 DFS,用一个boolean[] 数组记录当
Android 开发艺术探索笔记之七 -- Android 动画深入分析 写在最前:我之前整理过关于 Android 动画的两篇文章,所以本文更多的只是对之前遗漏的知识点加以补充,重复的部分不再详细描述。附上原本整理的两篇 动画相关 的文章:Android 视图动画(View Animation) 使用详解Android 属性动画(Property Animation) 使用详解欢迎大家提出各种意见!学习内容:View 动画 典型的四种...
LeetCode 高级 - 单词搜索 II 单词搜索 II给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。示例:输入: words = ["oath","pea","eat","rain"] and board ...
Android 开发艺术探索笔记之一 -- Android 的生命周期和启动模式 学习内容:Activity 的生命周期和启动模式以及 IntentFilter 的匹配规则分析 异常情况下的生命周期Activity 的启动模式以及 Flags隐式启动下的 Intent 匹配Activity 的生命周期全面分析 我的另一篇文章:详解 Android&Fragment 的生命周期 此处只是记录一下缺失的知识点,加以扩充。 建议本...
Android 开发艺术探索笔记之四 -- View 的工作原理 学习内容View 基础概念自定义 ViewView 的底层工作原理 测量流程布局流程绘制流程View 常见回调自定义 View 类型滑动效果初识 ViewRoot 和 DecorView基本概念ViewRoot对应于 ViewRootImpl 类,是连接 Window Manager 和 DecorView 的纽带。view 的三大流程均是通...
LeetCode 高级 - 矩阵中的最长递增路径 矩阵中的最长递增路径给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。示例 1:输入: nums = [ [9,9,4], [6,6,8], [2,1,1]] 输出: 4 解释: 最长递增路径为 [1, 2, 6, 9]。示例 2:输入: nums ...
Android 开发艺术探索 - 读书笔记目录 仅作为读书笔记使用,建议阅读原书。 书中代码部分已和现版本不符,建议对比最新版本学习。读了这本书,越发认识到和大佬们的差距。嗯,加油吧。过去の自分が今仆の土台となる[第 1 章 - Activity 的生命周期和启动模式] 第 2 章 - IPC 机制 第 3 章 - View 的事件体系 [第 4 章 - View 的工作原理] 第 5 章 - 理解 R...
Android 开发艺术探索笔记之十一 -- Android 的多线程和线程池 学习内容线程基本概念线程的不同形式 AsyncTaskHandlerThreadIntentService线程池基础原文开篇部分主线程主要处理和界面相关的事情,而子线程则往往用于执行耗时操作。线程的多种形态: AsyncTask:底层封装了线程池和 Handler,目的在于方便开发者在子线程中更新 UI。HandlerThread:底层直接使用了线程,它是一个...
Android 开发艺术探索笔记之十 -- Android 的消息机制 学习内容Android 的消息机制Handler 即其底层支撑原文开篇部分:从开发角度来说,Handler 是 Android 消息机制的上层接口,通过它可以将任务切换到 Handler 所在的线程中执行。更新 UI 仅仅是 Handler 的一个特殊的使用场景。本质不是专门用来更新 UI,只是常被用来这么做而已。Andorid 的消息机制主要指 Handler 的运行...
LeetCode 高级 - 戳气球 戳气球有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。现在要求你戳破所有的气球。每当你戳破一个气球 i 时,你可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻...
LeetCode 高级 - 天际线问题 天际线问题城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。现在,假设您获得了城市风光照片(图A)上显示的所有建筑物的位置和高度,请编写一个程序以输出由这些建筑物形成的天际线(图B)。 每个建筑物的几何信息用三元组 [Li,Ri,Hi] 表示,其中 Li 和 Ri 分别是第 i 座建筑物左右边缘的 x 坐标,Hi 是其高度。可以保证 0 ≤ Li, Ri ≤ INT_...
Android 开发艺术探索笔记之六 -- Android 的 Drawable 整理一下,基本只作为 知识清单 使用学习内容:Drawable 的层次关系Drawable 分类自定义 Drawable 的相关知识Drawable 简介Drawable 表示的是一种可以在 canvas 上进行绘制的图像的 抽象概念。实际开发中,Drawable 常被用来作为 View 的背景使用。优点:使用简单,比自定义 View 的成本低非图片类型...
LeetCode 高级 - 直线上最多的点数 直线上最多的点数给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。示例 1:输入: [[1,1],[2,2],[3,3]]输出: 3解释:^|| o| o| o +------------->0 1 2 3 4示例 2:输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4...
LeetCode 高级 - 最小窗口子字符串 最小窗口子字符串给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。示例:输入: S = "ADOBECODEBANC", T = "ABC"输出: "BANC"说明:如果 S 中不存这样的子串,则返回空字符串 ""。如果 S 中存在这样的子串,我们保证它是唯一的答案。分析核心思想: 首尾双指针,尾指针右移扩张找到包含目标字符...
LeetCode 高级 - 生命游戏 生命游戏根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞具有一个初始状态 live(1)即为活细胞, 或 dead(0)即为死细胞。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:如果活细胞周围八个位置的活细胞数少于两个,则该位置活...
Android 开发艺术探索笔记之五 -- 理解 RemoteViews 学习内容:RemoteViews 在通知栏和桌面小部件上的应用RemoteViews 的内部机制RemoteViews 的意义RemoteView 的应用实际开发中,RemoteViews 主要用在通知栏和桌面小部件的开发过程中。通知栏主要通过 NotificationManager 的 notify 方法实现,桌面小部件则是通过 AppWidgetProvider 来实现...
LeetCode 高级 - 接雨水 接雨水给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6分析观察上面的图...
LeetCode 高级 - 柱状图中最大的矩形 柱状图中最大的矩形给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。示例:输入: [2,1,5,6,2,3]输出: 10解...
LeetCode 高级 - 两个排序数组的中位数 两个排序数组的中位数给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。示例 1:nums1 = [1, 3]nums2 = [2]中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]中位数是 (2 + 3)/2 = 2.5...
LeetCode 高级 - 链表排序 链表排序在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5分析难点在于 时间复杂度限制在 O(nlo
LeetCode 高级 - 盛最多水的容器 盛最多水的容器给定 n 个非负整数 a*1,*a*2,…,*a*n,每个数代表坐标中的一个点 (*i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。注意:你不能倾斜容器,n 至少是2。分析本题实质就是计算最大的长方形面积,难点在于计算过程中有两个变量–长(x轴...
LeetCode 高级 - 实现 Trie(前缀树) 实现 Trie (前缀树)实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert("apple");trie.search("apple"); // 返回 truetrie.search("app"); // 返回 falsetrie...
Android 开发艺术探索笔记之三 -- View 的事件体系 学习内容View 基础滑动事件分发机制滑动冲突1. View 基础知识View 定义View 是 Android 种所有控件的基类,是一种界面层的控件的一种抽象,代表了一个控件ViewGroup 继承 View,其内部包含了许多个控件,即一组 ViewViewGroup 内部是可以有子 View 的,而这个子 View 同样还可以是 ViewGroupView...
Android 开发艺术探索笔记之二 -- IPC 机制 本文谨作为读书笔记使用学习内容:(IPC 机制)Android 中的多进程概念及注意事项序列化机制Binder (重点)Bundle、文件共享、AIDL、Messenger、ContentProvider 和 Socket 等进程间通信方式Binder 连接池各种进程间通讯的优缺点和使用场景1. IPC 简介IPC(Inter-Process Communi...
编译原理 概念小结 一、忘了标题。将某一种 程序设计语言 写的 程序 翻译成等价的 另一种语言 的 程序 的程序, 称之为编译程序(compiler) 。遍:对源程序或源程序的中间形式从头到尾扫描一遍,并做有关的分析加工,生成新的源程序的中间形式或生成目标程序。 二、形式语言与自动机基础BNF : 用来表示语法 eg. &lt;句子&gt; -&gt; &lt;主语&gt;&lt;谓语&gt;字
如何实现简单的多用户数据库存储 问题某些时候,我们需要多用户数据库,比如最简单的记事本程序,我如果需要分用户登录的话,那么显然每个用户的记事本库是要分离的,总不能对于所有用户记事本库共享吧,那么就太坑了。因此我们需要实现对不同用户,其数据分开存储。解决方案如果是 MySql,SqlServer 等等大型数据库,毫无疑问主外键嘛(这谁不知道啊,差评)。或者可以直接用户和数据存放在一张表,每次存放数据的时候,...
Android studio 3.0+ 为模拟器导入图片 问题很多时候,写一个 App 的 Demo,需要加载本地图片,但是模拟器直接打开会发现,图库中是空的,这时候就需要我们手动向里面添加图片。在 Android 3.0 以前,通过 DDMS 很轻松的把图片拖进去就是了。但是!在 Android 3.1 之后,会发现 DDMS 不见了,对,就是不见了。取而代之的是 Device File Explorer,我们也就是需要通过这个东西来导入图...
LeetCode 高级 - Sliding Window Maximum 高级 [字符串&amp;数组] - Sliding Window Maximum给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。返回滑动窗口最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释...
LeetCode 题解整理 按照 探索 中初级-中级-高级的顺序刷题,下面是目前完成的题解,未完成版,随时更新。初级数组 - 两个数组的交集 II数组 - 从排序数组中删除重复项数组 - 买卖股票的最佳时机 II数组 - 旋转数组数组 - 存在重复数组 - 只出现一次的数字数组 - 加一数组 - 移动零数组 - 两数之和数组 - 有效的数独数组 - 旋转图像字符串 - 反转字符串字符串 ...
LeetCode 高级 - 单词接龙 单词接龙给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 begin...
Android - ViewPager 从基础到进阶 基础介绍ViewPager 是Android support v4 包中的类,官方文档对其描述如下: Layout manager that allows the user to flip left and right through pages of data. 意思是说,其本身是一个布局管理器,允许我们左右滑动来切换不同的数据页面。它直接继承自 ViewGroup 类,...
LeetCode 高级 - 最长连续序列 最长连续序列给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。分析由于O(n)时间复杂度的限制,我们就不能采取先排序后遍历的思路。针对O(n)时间复杂度的实现思路:遍历nums[]数组,利用Map...
新手也能看得懂的 Android MVP 讲解 前言作为菜鸟一只,学习的新知识都要记下来,以便日后复习。本文侧重点在于介绍 Android MVP 的优劣,通过 Google 官方的to-do-mvp 系列项目了解官方是如何使用 MVP 的,并通过自己动手写一个小小的 MVP-demo 来加深对该模式的理解。不废话了,下面进入正文。MVC谈到 MVP,就不能不提它的“前身”- MVC,但为了更好的了解,我们还需要向上追溯...
LeetCode 高级 - 计算右侧小于当前元素的个数 计算右侧小于当前元素的个数给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于nums[i] 的元素的数量。示例:输入: [5,2,6,1]输出: [2,1,1,0] 解释:5的右侧有 2 个更小的元素 (2 和 1).2的右侧仅有 1 个更小的元素 (1).6的右侧有 1 个更...
LeetCode 高级 - 二叉树中的最大路径和 二叉树中的最大路径和给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不需要经过根节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 6示例 2:输入: [-10,9,20,null,null,15,7] -10 / \...
LeetCode 高级 - 课程表、课程表 II 课程表现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]] 输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以...
Android:RecyclerView 的使用,有这一篇就够了 谨以文章记录学习历程,如有错误还请指明。 RecyclerView 简介首先,可以理解 RecyclerView 是 ListView 的升级版,更加灵活,同时由于封装了 ListView 的部分实现,导致其使用更简单,结构更清晰。从名字 RecyclerView 来看,它直接提供了回收复用的功能,虽然 ListView 我们也可以自己实现 ViewHolder 以及 co...
LeetCode 高级 - 摆动排序 II 高级 [排序&搜索] - 摆动排序 II给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。示例 1:输入: nums = [1, 5, 1, 1, 6, 4]输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]示例 2:输入: nums = [1,...
LeetCode 高级 - 复制带随机指针的链表 复制带随机指针的链表给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深度拷贝。 分析该题参考 剑指Offer 复杂链表的复制。思路:在原链表中插入“影子节点”根据原节点random 更新影子节点的random分离原链表和“影子链表”,该链表即为深度拷贝的链表图示: 代码/**...
Android - Style 和 Theme 的那点儿事 Style and Themes简介Android 中,Styles 和 Themes 是很重要的一块,很大程度上影响着应用的美观程度,虽然可能在座的广大程序猿要说“好不好看得看 UI 设计啊,即便不好看我也不背锅”,但是如果不了解 Style 和 Theme,当 UI 提供给你一个漂亮到惊为天人的设计,你却无法在 Android 中将其还原,这岂不是很尴尬。。因此可以说Style 和...
LeetCode 高级 - Friend Circles Friend Circles班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果Mi = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已...
LeetCode 高级 - Lowest Common Ancestor of a Binary Tree 二叉树的最近公共祖先 Lowest Common Ancestor of a Binary Tree给定一棵二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义: “对于有根树T的两个结点u、v,最近公共祖先表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。”(一个节点也可以是它自己的祖先)例如,给定如下二叉搜索树: root = [3,5,1,6,2,0,8,null,nu...
LeetCode 高级 - 螺旋矩阵 螺旋矩阵给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例 2:输入:[ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12...
LeetCode 高级 - 正则表达式匹配 正则表达式匹配给定一个字符串 (s) 和一个字符模式 (p)。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。'.' 匹配任意单个字符。'*' 匹配零个或多个前面的元素。匹配应该覆盖整个字符串 (s) ,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例 1:输入:s...
LeetCode 高级 - Queue Reconstruction by Height Queue Reconstruction by Height假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。注意:总人数少于1100人。示例输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0],...
LeetCode 高级 - 最大数 最大数给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。示例 1:输入: [10,2]输出: 210示例 2:输入: [3,30,34,5,9]输出: 9534330说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。分析比较直观的想法是,将数组排序,再输出为字符串。那么问题来了,排序规则是什么?很简单,将两个数字颠倒连接比较就...
LeetCode 中级 - 从前序与中序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7分析关键在于前序遍历和中序遍历...
LeetCode 高级 - 数据流的中位数 数据流的中位数中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。...
LeetCode 高级 - 单词拆分 单词拆分给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释: 返回 true 因为 "leet...
LeetCode 高级 - Perfect Squares Perfect Squares给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3 解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.分析两种方法:常规动态规划,推状态转移方...
LeetCode 高级 - Best Time to Buy and Sell Stock with Cooldown Best Time to Buy and Sell Stock with Cooldown给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。...
LeetCode 高级 - 乘积最大子序列 乘积最大子序列给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。分析如果该题全为正数,那么就只是一道简单题,只要记录到i时...
LeetCode 高级 - Kth Smallest Element in a Sorted Matrix Kth Smallest Element in a Sorted Matrix给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素,而不是第k个元素。示例:matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15]],k = 8,返回 13。说明...
LeetCode 高级 - 被围绕的区域 被围绕的区域给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的...
LeetCode 高级 - 合并K个元素的有序链表 合并K个元素的有序链表合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6分析采用最小堆的思想,将K个链表的头节点放入优先队列中,遍历时返回队首元素,并把该...
LeetCode 高级 - Basic Calculator II Basic Calculator II实现一个基本的计算器来计算一个简单的字符串表达式的值。字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格。 整数除法仅保留整数部分。示例 1:输入: "3+2*2"输出: 7示例 2:输入: " 3/2 "输出: 1示例 3:输入: " 3+5 / 2 "输出: 5说明:你可以假设所给定的表达...
LeetCode 高级 - 寻找重复数 寻找重复数给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间,包括 1 和 n ,可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。时...
LeetCode 高级 - 第一个缺失的正数 第一个缺失的正数给定一个未排序的整数数组,找出其中没有出现的最小的正整数。示例 1:输入: [1,2,0]输出: 3示例 2:输入: [3,4,-1,1]输出: 2示例 3:输入: [7,8,9,11,12]输出: 1说明:你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。分析由于线性时间和常数空间的要求,我们开不了数组,用不了哈...
LeetCode 高级 - 四数相加 II 四数相加 II给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228- 1 之间,最终结果不会超过 231 - 1 。例如:输入:...
LeetCode 高级 - Product of Array Except Self Product of Array Except Self给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶:你可以在...
LeetCode 中级 - Task Scheduler Task Scheduler给定一个用字符数组表示的 CPU 需要执行的任务列表。其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。CPU 在任何一个单位时间内都可以执行一个任务,或者在待命状态。然而,两个相同种类的任务之间必须有长度为 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同...
LeetCode 中级 - 求众数 求众数给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2分析map记录啊,遍历啊,这题就A了啊代码 class Solution { ...
LeetCode 中级 - 逆波兰表达式求值 逆波兰表达式求值根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: ["2", "1", "+", "3", "*"]输出: 9解释: ((2 + 1) *...
LeetCode 中级 - 两整数之和 两整数之和不使用运算符 + 和-,计算两整数a 、b之和。示例:若 a = 1 ,b = 2,返回 3。分析这道题实际上就是在考 计算机底层是如何实现加减法的。很明显计算机本身是不动+ - 的,它的底层是通过 异或 和 与 两个位运算来实现的,异或 是不带进位的结果, 与 是进位。代码“ class Solution { public i...
LeetCode 中级 - x 的平方根 x 的平方根实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。分析只是使用了二分进行优化代...
LeetCode 中级 - Excel表列序号 Excel表列序号给定一个Excel表格中的列名称,返回其相应的列序号。例如, A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...示例 1:输入: "A"输出: 1示例 2:输入: "AB"输出: 28...
LeetCode 中级 - 阶乘后的零 阶乘后的零给定一个整数 n,返回 n! 结果尾数中零的数量。示例 1:输入: 3输出: 0解释: 3! = 6, 尾数中没有零。示例 2:输入: 5输出: 1解释: 5! = 120, 尾数中有 1 个零.说明: 你算法的时间复杂度应为 O(log n) 。分析核心在于:怎么得到10?答:2的倍数*5其次,2和5谁出现的频率高?答:显然是5,...
LeetCode 中级 - 快乐数 快乐数编写一个算法来判断一个数是不是“快乐数”。一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。示例: 输入: 19输出: true解释: 1^2 + 9^2 = 828^2 + 2^2 = 686^2 + 8^2 = 100...
LeetCode 中级 - Insert Delete GetRandom O(1) Insert Delete GetRandom O(1)设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。insert(val):当元素 val 不存在时,向集合中插入该项。remove(val):元素 val 存在时,从集合中移除该项。getRandom:随机返回现有集合中的一项。每个元素应该有相同的概率被返回。示例 :// 初始化一个空的集合。Ra...
LeetCode 中级 - Longest Increasing Subsequence Longest Increasing Subsequence给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。进阶:...