- 博客(12)
- 收藏
- 关注
原创 算法:反转链表
剑指 Offer 24. 反转链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 限制: 0 <= 节点个数 <= 50001.迭代: // 1.双指针迭代(方法中循环遍历,比如for/while) public ListNo...
2020-07-01 17:14:05
338
转载 算法:快速排序
高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列:3 1 2 5 4 6 9 7 10 8在初始状
2020-06-22 14:53:36
271
原创 算法:剑指Offer-面试题59 - II. 队列的最大值
面试题59 - II. 队列的最大值难度中等107收藏分享切换为英文关注反馈请定义一个队列并实现函数max_value得到队列里的最大值,要求函数max_value、push_back和pop_front的均摊时间复杂度都是O(1)。若队列为空,pop_front和max_value需要返回 -1示例 1:输入: ["MaxQueue","push_back","push_back","max_value","pop_front","max_value"][[],[1...
2020-06-19 14:44:31
192
转载 算法:冒泡排序
上一篇文章「 排序算法 」已经整体的把排序算法的分类和评估方法介绍了一下,今天起咱们就开始依次介绍一下各种排序算法的原理和特性。咱们就从最容易理解的「 冒泡排序 」开始吧。一、「 冒泡排序 」是什么?冒泡排序是一种交换排序,它的思路就是在待排序的数据中,两两比较相邻元素的大小,看是否满足大小顺序的要求,如果满足则不动,如果不满足则让它们互换。然后继续与下一个相邻元素的比较,一直到一次遍历完成。一次遍历的过程就被成为一次冒泡,一次冒泡的结束至少会让一个元素移动到了正确的位置。所以要想让所有元素都排序好,一次
2020-06-16 17:35:57
200
转载 算法:排序算法
之前的文章咱们已经聊过了「 数组和链表 」、「 堆栈 」、「 队列 」和「 递归 」,这些要么是基础的数据结构,要么就是巧妙的编程方法。从今天起咱们来进入真正的算法阶段,看一看“排序算法”。排序算法有很多,如:「冒泡排序」、「插入排序」、「选择排序」、「希尔排序」、「堆排序」、「归并排序」、「快速排序」、「桶排序」、「计数排序」、「基数排序」等等。下图是常用排序算法的时间空间复杂度:排序算法这么多,这里先将排序算法做个简单分类:可以根据待排序的数据量规模分类:内部排序:在排序过程中,待排序
2020-06-16 17:04:40
161
转载 编程方式:递归
「 递归 」并不是一种数据结构,它是很多算法都使用的一种编程方法。它太普遍了,并且用它来解决问题非常的优雅,但它又不是那么容易弄懂,所以我特意用一篇文章来介绍它。一、「 递归 」是什么?递归就是指函数直接或间接的调用自己,递归是基于栈来实现的。递归的经典例子就是斐波拉契数列(Fibonacci)。一般如果能用递归来实现的程序,那它也能用循环来实现。用递归来实现的话,代码看起来更清晰一些,但递归的性能并不占优势,时间复杂度甚至也会更大一些。上图为 斐波拉契数列 图例。要实现递归,必须满足2个..
2020-06-16 11:45:54
823
转载 算法:队列
算法的系列文章中,之前咱们已经聊过了「 数组和链表 」、「 堆栈 」,今天咱们再来继续看看「 队列 」这种数据结构。「 队列 」和「 堆栈 」比较类似,都属于线性表数据结构,并且都在操作上受到一定规则约束,都是非常常用的数据类型,咱们掌握得再熟练也不为过。一、「 队列 」是什么?队列(queue)是一种先进先出的、操作受限的线性表。队列这种数据结构非常容易理解,就像我们平时去超市买东西,在收银台结账的时候需要排队,先去排队的就先结账出去,排在后面的就后结账,有其他人再要过来结账,必须排在队.
2020-06-16 10:22:14
518
转载 算法:堆栈
上一篇聊数据结构中最基础的「 数组 」和「 链表 」,今天咱们再来继续看看「 堆栈 」吧。一、「 堆栈 」是什么?堆栈(stack)是一种先进后出的、操作受限的线性表,也可以直接称为栈。可以把栈想象成一个桶一样,往这个桶里面一层一层的放东西,先放进去的在里面,后放进去的东西依次在外面。但取东西的时候就是先取靠近外面的,再依次一层层取里面的。这就是 后进先出( Last In-First Out )的原则。因此「 栈 」虽然是线性的,有2个端:顶端和底端,但它只允许从一端进行插入和删除数.
2020-06-15 07:41:55
651
转载 算法:数组与链表
数据结构是我们软件开发中最基础的部分了,它体现着我们编程的内功。大多数人在正儿八经学习数据结构的时候估计是在大学计算机课上,而在实际项目开发中,反而感觉到用得不多。其实也不是真的用得少,只不过我们在使用的时候被很多高级语言和框架组件封装好了,真正需要自己去实现的地方比较少而已。但别人封装好了不代表我们就可以不关注了,数据结构作为程序员的内功心法,是非常值得我们多花时间去研究的,我这就翻开书复习复习:本文就先从大家最经常使用的「 数组 」和「 链表 」聊起。不过在聊数组和链表之前,咱们先看一下数据的逻
2020-06-12 08:50:41
158
转载 算法:时间复杂度与空间复杂度
算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的「时间」和「空间」两个维度去考量。 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。 因此,评价一个算法的效率主要是看它的时间复杂度和空间复
2020-06-11 14:35:01
253
原创 android studio中AVD模拟器添加APK文件的方法
例:在AVD模拟器中安装搜狗中文输入法 ①下载搜狗的apk文件:选择x86的( x86是可以兼容armeabi平台运行的,无论是armeabi-v7a还是armeabi,同时带来的也是性能上的损耗,另外需要指出的是,打包出的x86的so,总会比armeabi平台的体积更小,对于性能有洁癖的童鞋们,还是建议在打包so的时候支持x86。) ②打开AVD模拟器:
2017-03-15 19:41:51
21138
4
原创 Scanner()类的使用
Scanner()类:作用:起一个数据传递的作用,不用Scanner()时,数据需要在代码中输入(感觉跟静态的方式一样,数据值已经定义好了);使用了Scanner(),可以在控制台中输入数据(感觉变成了动态的方式)。具体用法:Scanner sc = new Scanner(System.in);然后sc对象(上面定义的对象)调用下列方法(函数),读取用户在命令行输入的各种数据类型:h
2017-03-11 23:18:20
651
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人