剑指offer-----算法学习(Android)
学习剑指offer中的相关算法,以到达融汇贯通,提升对于算法的理解,加深相关算法的运用; 由于本人是个Android开发的小菜鸟,所以会从Android编码的角度去理解。
Heynchy
这个作者很懒,什么都没留下…
展开
-
算法学习-给定数字n, 在{1,2,3...n}中任意组合成n位数(数字不重复),求第key小的位置上的组合数
题目:给定数字n, 在{1,2,3...n}中任意组合成n位数(数字不重复),求第key小的位置上的组合数字是多少? 例如:给定数字n =3,可以得到所有的数字组合为{123,132,213,231,312,321}, 那么第key=4位置上的数就是===》231代码实现与理解: 1. 根据key得出各个位置上的数字----在剩余数字--中的位置(从小到大) 例如...原创 2020-05-22 10:42:27 · 643 阅读 · 0 评论 -
基础算法-快速排序的理解与实现-Android版
快速排序:冒泡的进化版,根据某一值key, 将大于key 的往后放,将小于key的往前放;通俗结果就是最后key值左边的比key都小,key值右边的比key都大;在对两侧的序列单独进行key值比较交换,依次类推...代码的实现与理解: int a[] = {5, 3, 4, 8, 9, 1, 7, 0, 2, 6}; sort(a, 0, a.length - 1); for (int h = 0; h < a.length; h++) {原创 2020-05-14 16:28:38 · 224 阅读 · 0 评论 -
基础算法-归并排序的理解与实现-Android版
归并排序:采用分治法排序,先分后治; 将数组分成两个数列,再将左子数列分成两个数列,再将右子数列分成两个数列...直到每一个子数列只有一个数字; 然后就是治,也称为merge;将两个有序数列合并成一个有序数列的过程;代码实现与理解: int a[] = {2, 3, 5, 6, 9, 0, 4, 7, 8}; // 归并排序 sort(a, 0, a.length-1); for (int h=0;h < a.length;h +原创 2020-05-11 14:09:11 · 172 阅读 · 0 评论 -
基础算法-希尔排序的理解与实现-Android版
希尔排序:直接插入排序的进化版,又称为“缩小增量排序”; 根据key值,将待排序数列分成若干个子序列,针对每一个子序列进行直接插入排序;然后逐步缩小key值,直到key=1,此时即为直接插入排序;例如: a[] = {5, 3, 9, 6, 2, 1, 4, 0, 8, 7};假如key=5, 可知{5, 1}===>...原创 2020-05-08 15:02:18 · 233 阅读 · 0 评论 -
基础算法-插入排序的理解与实现-Android版
插入排序:从未排序的数组中选择一个数,插入一个有序的数组中;代码实现的重点就是找到该数字在有序数组中的位置,并插入代码理解与实现 1: int a[] = {5, 3, 9, 6, 2}; for (int i = 0; i < a.length; i++) { Log.i("ch...原创 2020-05-07 15:08:57 · 146 阅读 · 0 评论 -
基础算法-冒泡排序的理解与实现-Android版
背景:冒泡算法是一个十分基础的算法,奈何自己脑子不好使,总也记不住,故做此文章,以便记忆。理解:冒泡算法的官方说明就不写了,通俗的理解就是每一轮进行--相邻两两比较--并把---最大的那个数----找出来放在最后;因为每一轮循环都会得到一个最大的数冒出来,所以称之为冒泡算法;写代码前有两点要理解: 1. 整个数组完成排序需要进行n-1轮比较:例如 int a[] = {...原创 2020-04-28 09:46:45 · 254 阅读 · 0 评论 -
面试题 9.1 用两个队列实现一个栈(Android版)
相关题目: 用两个队列实现一个栈思路分析: 整体的思想跟用两个栈实现一个队列,大同小异直接源码:/** * Author: Heynchy * Date: 2019/11/21 * <p> * Introduce: 用两个队列实现栈的操作 */public class StackUtil { private static LinkedLis...原创 2019-11-21 18:10:49 · 201 阅读 · 0 评论 -
面试题 8:二叉树的下一个节点----Android端的实现方式
题目:给定一颗二叉树和其中的一个节点,如何找出中序遍历的下一个节点?树中的节点除了有两个分别指向左,右子节点的指针,还有一个指向父节点的指针。(二叉树如下图所示) 中序遍历:{d,b,h,e,i,a,f,c,g}分析: 考虑中序遍历的特点以及下一个节点可能出现的情况1. 节点的左子树不可能有下一节点(中序遍历)2. 节点的右子树存在时,其右子树的最左子节点就是下一节...原创 2019-07-18 11:32:51 · 121 阅读 · 0 评论 -
面试题7: 重建二叉树---Android端实现方式
题目:题目:输入某二叉树的前序和中序遍历结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4, 7, 2,1,5,3,8,6},则重建如下图所示的二叉树并输出它的头结点。...原创 2019-07-16 14:58:04 · 223 阅读 · 0 评论 -
面试题 7 :二叉树遍历-前序遍历(DLR),中序遍历(LDR),后序遍历(LRD)-Android端非递归实现
二叉树实体定义:/** * Author: Heynchy * Date: 2019/6/24 * <p> * Introduce: 二叉树的定义 */public class TreeNode implements Serializable { private TreeNode left; // 左子树 private TreeNode r...原创 2019-07-09 19:08:28 · 590 阅读 · 0 评论 -
面试题7: 二叉树基础知识 - 前序遍历(DLR), 中序遍历(LDR), 后续遍历(LRD) - Android 端递归实现
二叉树定义:/** * Author: Heynchy * Date: 2019/6/24 * <p> * Introduce: 二叉树的定义 */public class TreeNode implements Serializable { private TreeNode left; // 左子树 private TreeNode ri...原创 2019-06-28 14:04:19 · 1043 阅读 · 0 评论 -
链表初识(二):找到链表中第一个含有某值的节点并删除该节点
由于链表的内存不是一次性分配的,因而无法保证链表的内存和数组一样是连续的。如果想查找某一个节点,则只有从头节点开始遍历,其时间效率为O(n);在数组中可根据下标来找到目标的元素,其时间效率为O(1); 如果想要找到某一节点的值或者某个数组位置存储的值,则时间效率都为O(n);代码以及相关说明如下: /** * 删除链表中的某一节点 * * @param...原创 2019-02-28 15:30:42 · 1102 阅读 · 0 评论 -
链表初识(一): 在链表的末尾插入一个数据
链表是一种动态的数据结构,在创建链表时无须知道链表的长度。代码实现:/** * 链表的实体类型 */ public class ListNode{ int value; // 节点的值 ListNode listNode; // 类似于指针 public int getValue() { ...原创 2019-02-21 10:38:11 · 3478 阅读 · 0 评论 -
面试题 5: 替换空格
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”, 则输出“We%20are%20happy.”。整个字符串的替换在Java中有很多简便的方法,例如正则表达式。这里我们还是按照书上的方法来进行实现。将字符串看成是字符数组来进行相关处理。代码实现以及相关理解: /** * 替换空格 * * 方法...原创 2019-02-20 13:55:29 · 94 阅读 · 0 评论 -
面试题 4:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。测试数组: 1 2 8 9 2 4 9 12 4 ...原创 2019-02-12 14:45:47 · 107 阅读 · 0 评论 -
面试题 3: 数组中重复的数字(三)
题目二:不修改数组找出重复的数字 在一个长度为n+1的数组里的所有数字都在 1~n 的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为 8 的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数组 2或者 3。分析理解: 例如:{2,3,5,4,3,2,6,7} ===> 8 个数, 二...原创 2019-01-23 11:32:04 · 193 阅读 · 0 评论 -
面试题 3: 数组中重复的数字(二)
题目一 :找出数组中重复的数字在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为 7 的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数组2或者3。 第二种解法: 重新排列数组的方法 ---- 时间复杂度O(n), 空间复杂度O(1)...原创 2018-12-12 16:36:53 · 210 阅读 · 0 评论 -
面试题 3: 数组中重复的数字(一)
题目一 :找出数组中重复的数字 在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为 7 的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数组2或者3。 第一种解决方法:利用哈希表来解决这个问题 (时间复杂度O(n), 空间复杂度...原创 2018-12-03 18:40:57 · 207 阅读 · 1 评论 -
面试第2题:单例模式(Singleton)---Android端双重校验锁
面试场景: 写一个你认为最好的单例的实现方式应对: Android端双重校验锁的单例实现理解: 理解单例的基本原理,写起来就容易多了,可理解为全局只有这一个实例手写:已经在代码的注释中说明了面试时,可能会延申的几个小问题;理解不透彻的地方,还请多多指教。public class SingletonMode { /** * volatile关键字: 保持内存的可见...原创 2018-11-26 14:21:20 · 1098 阅读 · 0 评论 -
面试第1题:赋值运算符的理解(Android)
其实基本的运算符使用每个人都会,但是有时候细节的处理还欠缺火候,导致面试上出现失误。从自身小菜鸟的经历出发,比较难理解的就是 a++ 和 ++ a的使用顺序问题,虽然很明白,但是有时候会很蒙。具体的理解都在注释中: public static void main(String[] args) { int a, b, c; a = b = c = 5; ...原创 2018-11-26 14:12:58 · 193 阅读 · 0 评论