- 博客(730)
- 资源 (28)
- 收藏
- 关注
原创 经典算法学习——求二叉树叶子节点的个数
二叉树的叶子节点是既没有左子树又没有右子树的特殊的节点,使用递归我们可以方便的计算出共有多少叶子节点。代码上传至 https://github.com/chenyufeng1991/BinaryTreeLeafCount 。核心代码如下:int leafCount = 0;void LeafCountBinaryCount(Node *node){ if (node == NULL
2016-10-02 18:27:03 10684 1
原创 经典算法学习——求二叉树节点和为sum的路径
在一棵二叉树中,有多少个叶子节点,就会有多少条从根节点到叶子节点的路径。如果给每一个节点一个data值,那么每一条路径经过的节点data加起来就为sum,现在根据给定的sum,请找出有哪些路径符合这个sum。代码上传至 https://github.com/chenyufeng1991/BinaryTreePath 。 整体思路就是递归的去检索,每当经过一个节点的时候,就把节点值放入
2016-10-02 12:20:55 4588
原创 经典算法学习——求包含某两个字符的最小子串的长度
碰到这样一道算法题:给定一个字符串,比如: cadacacbedffffreaaawc ,然后给定两个字符为f,c ,那么最短子串的长度为5。因为子串有cbedf,freaaawc. 这篇博客考虑的比较简单,是只有两个字符的情况,我会在后续的博客中讲解如果需要包含多个字符那么应该如何处理。本篇的代码上传至 https://github.com/chenyufeng1991/MaxLengt
2016-10-02 10:19:17 3186
原创 经典算法学习——层序遍历二叉树
我们可以用很多方式去遍历一颗二叉树,比如先序遍历,中序遍历,后序遍历,其实都是通过递归的来实现。今天我们来对二叉树进行层序遍历,层序遍历的时候需要借助另一种数据结构——队列。本篇的示例代码上传至 https://github.com/chenyufeng1991/LevelOrderBinaryTree 。 层序遍历的基本思路是,当访问到一个节点的时候,把它放入队列,然后访问该值,同时
2016-10-01 17:16:44 3987
原创 经典算法学习——交换二叉树的左右子树(二叉树的翻转)
对于二叉树,我们必须熟练掌握它的各种操作,今天我们要来实现二叉树的翻转,也就是交换左右子树。具体思路不难,如果一个节点是叶子节点,则不做操作;如果一个节点只有左孩子或者右孩子,则进行交换,原来的孩子为空;如果一个节点既有左孩子和右孩子,则交换左右孩子。详细代码上传至 https://github.com/chenyufeng1991/ReverseLeftRightChild。核心代码如下://
2016-10-01 11:41:43 26982 2
原创 经典算法学习——求次方函数实现
在如今很多的笔试面试中,都会出现让你实现某个函数的,并且进行优化,比如降低时间复杂度。而在手写代码中,求次方函数是很高频的考点。示例代码上传至:https://github.com/chenyufeng1991/PowerFunction。题目如下:实现 double power(double x, int n)函数,实现求x的n次方。注意,n有可能为正或者负。(1)最简单的实现,循环// 最
2016-09-30 11:37:50 4483 1
原创 C++中字符串和数字相互转化实现
在刷一些题目的时候,总是会碰到字符串和数字进行转化的问题,今天我们就在C++中来用多种方法实现。示例代码上传至 https://github.com/chenyufeng1991/TransferStringAndInt 。(1)string -> char *// string -> char * string str3 = "chenyufeng"; const char *s
2016-09-28 22:45:29 4358
原创 C++ STL学习——heap
heap堆其实是一种比较复杂的数据结构,尤其涉及到建堆和调整堆的时候。好在在STL中已经封装了heap的一些操作,可以让我们比较方便的使用堆。比如判断堆,删除一个元素,插入一个元素,以及堆排序。示例代码上传至 https://github.com/chenyufeng1991/STL_heap 。(1)首先导入头文件.(2)这里使用数组来存储一个堆,也就是堆化数组,为了方便使用,我把数组转化为ve
2016-09-28 20:11:10 2954
原创 C++ STL学习——algorithm
在之前的博客中我们学习了很多STL中的模板库,包括deque,queue,stack,list等,他们都是一种数据结构,也就是说STL已经为我们实现了。今天我们来讲讲STL中比较大的一个库. 主要是一些算法的运算的实现,示例代码上传至 https://github.com/chenyufeng1991/STL_algorithm 。 在使用STL中的algorithm之前,需要导入头
2016-09-24 11:54:00 4490 1
原创 C++ STL学习——deque
在数据结构中还有一种很常见的队列叫做双端队列,我们在上一篇博客《C++ STL学习——queue》中讲到的队列queue是一种最标准的队列,只能在尾部插入数据,在头部删除数据。而今天我们讲到的deque分别可以在两端进行插入与删除,可以说用起来更加的灵活。示例代码上传至 https://github.com/chenyufeng1991/STL_deque 。(1)创建一个deque deq
2016-09-07 00:05:30 2976
原创 C++ STL学习——queue
我们在上一篇博客中《C++ STL学习——stack》简单介绍了STL 中stack这种数据结构的使用,这篇博客主要来讲一下queue队列的使用。其实queue的使用和stack一样简单。示例代码上传至 https://github.com/chenyufeng1991/STL_queue 。(1)首先要引入头文件 #include . 并使用命名空间 using namespace std
2016-08-23 00:08:23 3765
原创 C++ STL学习——stack
栈是最为常用的数据结构了,很多算法都是依靠栈来实现的,比如递归。我们要手动来实现栈,显得十分繁琐和麻烦,而且复用性不好。C++ 的STL中已经帮我们封装好了栈,我们只要方便的进行调用即可。该篇博客主要介绍STL 中stack的使用,stack应该说是STL中最简单的容器了。实例代码上传至 https://github.com/chenyufeng1991/STL_stack 。(1)首先引入头文
2016-08-22 23:50:45 3079
原创 C++ STL学习——list
如果由我们自己来实现一个链表,会写上不少代码,包括要实现创建、删除、插入等等操作。但是如果我们用了STL,那么该模板库就为我们提供了一个双向链表list,可以让我们非常方便的实现链表操作。要使用list,首先要引入头文件 #include .相关的示例代码上传至 https://github.com/chenyufeng1991/STL_list 。(1)创建list list lis
2016-08-22 00:00:56 2494
原创 C++ STL学习——vector
学过C++的人肯定会很熟悉STL标准模板库,STL其实就是封装了一系列的接口,供我们调用。很多函数或者算法的实现不需要我们从头开始写,大大提高我们的编程效率。这篇博客在简单介绍STL的情况下,会详细的来介绍vector的使用。 STL共有六大组件:一。容器(Container):是一种数据结构,如list,vector,deque,queue等,以模板类的方法提供,为了访问容器中的数据,可
2016-08-21 21:45:08 3995
原创 经典算法学习——打印两个链表的第一个公共节点
求链表的公共节点是一道很经典的算法题,并不是很难。我们需要知道的是,一旦两个链表有一个公共节点的话,那么这两个链表的形状就是一个“Y”型。也就是说,自公共节点之后的所有节点都是一样的。如下:其实只要看了这幅图,实现就很简单了。首先我们分别遍历两个链表,分别得出他们的长度L1,L2。然后在查找公共节点时,先在长的那个链表中走|L1-L2|步,然后两个链表同时向后进行同步遍历,每走一步时,就判断后面那
2016-08-21 20:24:43 2057
原创 经典算法学习——第一个只出现一次的字符
这同样是剑指Offer中的很经典的一道面试题。题目描述为:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'. 一开始大家就会想到最简单的方法就是每访问到一个字符的时候,与后面的每一个字符去进行比较,若没有发现相同的元素,那么该元素就是第一个只出现一次的字符。这样的复杂度为O(n^2). 显然这样的效率不高。 这道题的大方向就是一题查找算法,常见的查
2016-08-21 19:58:06 2323
原创 经典算法学习——合并两个有序链表
类似的,合并两个有序的数组或者链表也是剑指Offer中的经典题型。题目描述如下:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。我这里以合并链表来实现。 在这里,并不需要去创建一个新的链表,只要有三个节点指针就行,第一个节点指针Node1指向第一个链表,第二个节点指针Node2指向第二个链表,第三个节点指针Node3指向新的链表。简单的示意图如下:当下一个
2016-08-21 16:59:45 2692
原创 经典算法学习——链表中倒数第k个节点
这是剑指Offer中非常经典的一道题,也是在面试笔试中高频出现。题目的详细描述如下:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,从1开始计数,即链表的尾结点是倒数第一个节点。 本题有一个非常直观的解法,就是对链表扫描两遍,第一遍用来记录链表长度为n,第二次从链表头部走(n-k+1)步后,找到的那个节点就是倒数第k个节点。这种算法的问题就是需要扫描链表两遍,显得不是
2016-08-21 16:30:54 2033
原创 经典算法学习——在O(1)时间删除链表节点
这道算法题同样是剑指Offer中的一道题,题目描述为:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。其实我们知道,想要在单向链表中找到某个节点并删除它,复杂度为O(n),因为必须从头遍历才能找到它(最重要的是因为要找到它的前一个节点。)所以想要O(1)完成,必须想其他的方法。 目前重要的一个信息就是已经有一个节点指针指向当前要删除的节点。这就比较好办了。我们
2016-08-21 13:26:54 2008
原创 C++ STL学习——string
当我们一开始使用C语言来处理字符串的时候,会感觉非常的麻烦。C语言中缺少相应的字符串处理函数,如果想要实现某个字符串功能,只能靠我们自己来实现。但是当来到C++中,字符串的处理就会变得异常简单。今天我们就来学习一下C++中最高频的字符串处理函数。示例代码上传至:https://github.com/chenyufeng1991/CppString。 首先要引入C++中的字符串头文件:#i
2016-08-21 11:37:53 2998
原创 经典算法学习——逆转链表
链表在数据结构中是一种非常重要的线性数据结构,也是各类面试笔试中常常涉及的问题。其中最常见的一个问题就是“输入一个链表的头结点,从尾到头反过来打印出每个节点的值”,简单说就是逆转链表。当然,有人会发现,这其实就是剑指Offer中的一道题。这道题的实现我已经上传至 https://github.com/chenyufeng1991/ReverseLinkedList_Stack 。 这道
2016-08-07 16:51:41 4982
原创 经典算法学习——最小的k个数
经常面试的同学可能会遇到这个问题,即输出数组中的最小的k个数。同样的,这也是剑指Offer上面的一道题。这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数。这样实现的复杂度为O(nlogn)。如果大家看了上一篇博客《经典算法学习——数组中出现次数超过一半的数字》后,其实会发现两道题的思路是一样的,也就是要找到一个index值,它的前面都比它小,后面的都比它大。
2016-08-06 20:27:24 2072
原创 经典算法学习——数组中出现次数超过一半的数字
首先这道算法题并不是很难,看过剑指Offer的同学都知道这是里面的一道题。在各大公司的面试中也是经常被用到的,今天我们就采用最常规的方法来实现一下。 首先有人会想到,如果能把数组排序后,那么中间的那个数字就是超过一半的那个数字了(如果存在的话)。当然排序较快的复杂度为O(nlogn).这种方法完全可以实现,但未必是最好的。 因此,面试中最常规的解法就是使用快速排序中的Par
2016-08-06 17:31:17 2321
原创 经典算法学习——斐波那契数列
在我们学习算法的过程中,斐波那契数列肯定是会碰到的一个东西,其实我们并不是为了学习一个简单的数列,更重要的是学习他的思想——递归。个人觉得递归是解决很多算法问题最高频的方法了。递归最简单的描述就是一个函数自己调用自己,达到一个条件的时候,递归结束。比如我们在以下场景常常用递归:快速排序、归并排序、二叉树的多种遍历方法等等。对于C语言实现斐波那契数列的代码已经上传至 https://github.c
2016-08-06 14:34:59 2773
原创 经典算法学习——二分查找
在所有的查找算法中,二分查找是最简单一种。二分查找要求原先的序列是已经排序的,每次都是以序列中间的数字作为比较,如果小于中间的数字,那么就在序列左边继续递归查找;如果大于中间的数字,那么就在序列右边继续递归查找。直到找到该数字,或者直到序列中只有一个数字的时候都还没找到,则查找失败。查找的时间复杂度可以达到O(logN),应该说是除了数组按下标查找O(1)以外的最快的查找方式了。示例代码上传至 h
2016-08-06 13:47:32 2147
原创 iOS运行时Runtime浅析
运行时是iOS中一个很重要的概念,iOS运行过程中都会被转化为runtime的C代码执行。例如[target doSomething];会被转化成objc)msgSend(target,@selector(doSomething))来执行。这篇博客会较为全面的来讲解下Runtime。(1)当我们需要使用Runtime的接口时,需要导入头文件:#import ,Runtime可以进行如下操作,在运行
2016-07-17 21:43:47 11673 1
原创 iOS开发——响应链(Responder Chain)的深入理解和代码示例(二)
响应链机制是开发中很重要的概念,在一些事件的处理中需要对响应链的传递有深入的了解,我们才能对事件的传递有更好的控制。今天我们继续来研究下响应链,并实现一个很简单的功能。示例代码已经上传至 https://github.com/chenyufeng1991/HitTest ,可以进行下载调试。要实现的一个很简单的功能就是:透过顶部视图,让底部视图来响应点击事件,这也会响应链使用中非常重要的应用。下面
2016-07-10 17:31:21 6768
原创 iOS开发——UIImageView的contentMode、裁剪和layer属性详解
在我们iOS开发过程中,UIImageView是一个非常常见的控件,但是我们未必会用的很溜,因为里面的有些属性不曾注意,或者很难理解。所以会对我们使用该控件带来麻烦,在布局UI过程中可能会造成意想不到的结果。这篇博客主要来讲解UIImageView中的contentMode属性以及和图片裁剪的关系,并且不得不提到就是所有UIView的重要属性:layer(CALayer)。文中提到的所有·示例代码
2016-07-03 13:14:09 14453
原创 iOS多线程开发——GCD的使用与多线程开发浅析(二)
对于iOS多线程开发,我们时刻处于学习之中,在看书中,看文档中,项目开发中,都可以去提高自己。最近刚看完了《Objective-C高级编程 iOS与OS X多线程和内存管理》这本书后,对多线程有了更为深入的理解,故在此做一个总结与记录。这本书我已经上传至网盘 https://pan.baidu.com/s/1c2fX3EC ,这本书是iOS开发者必读的书之一,写得很不错,欢迎大家下载阅读。书的封
2016-07-02 13:50:17 10250 1
原创 WWDC Session视频没有字幕解决办法
2016年的苹果全球开发者大会已经落下帷幕,个人还是强烈建议每个iOS开发者都去看一下大会视频。但是对于我们开发来说,真正的重头戏并不是开始的第一场大会演讲,而是后续的大量session,这才是我们需要去每一集慢慢看的。Session中会比较详细的介绍各个平台的新特性,语言的新特性,以及各种新功能等等。官方视频地址:https://developer.apple.com/videos/wwdc20
2016-06-28 22:48:50 9720
原创 iOS开发——深拷贝与浅拷贝详解
深拷贝和浅拷贝这个问题在面试中常常被问到,而在实际开发中,只要稍有不慎,就会在这里出现问题。尤其对于初学者来说,我们有必要来好好研究下这个概念。我会以实际代码来演示,相关示例代码上传至 这里 。 首先通过一句话来解释:深拷贝就是内容拷贝,浅拷贝就是指针拷贝。 深拷贝就是拷贝出和原来仅仅是值一样,但是内存地址完全不一样的新的对象,创建后和原对象没有任何关系。浅拷贝就是拷贝指向原
2016-06-28 01:41:07 12279 4
原创 iOS开发——frame和bounds详解
在iOS的UI开发中,frame和bounds是两个非常容易搞混的概念,而很多开发者在实际项目中也很少去区分,因此会导致出现一些意想不到的问题。本篇博客以实际代码的方式来学习frame和bounds的使用。相关示例代码上传至 https://github.com/chenyufeng1991/FrameAndBounds ,欢迎大家下载查看。(1)先来查看一个界面中的容器self.view的fra
2016-06-26 23:00:56 8113 1
原创 iOS开发实战——摄像头与相册权限获取逻辑优化
在实际项目中,我们经常需要访问设备的摄像头或者相册,当第一次安装某个App的时候,系统便会弹出授权对话框,要求用户做出是否授权的判断。整体逻辑比较简单,但是在使用过程中需要对用户体验进行优化,否则会出现bug。该博客的示例代码已经上传至 https://github.com/chenyufeng1991/AuthorityOfCameraAndPhoto 。 首先我先描述一下出现的问题
2016-06-22 02:01:55 12823 2
原创 iOS开发实战——CollectionView中cell的间距设置
我在前面多篇博客中详细讲解了CollectionView的使用与自定义CollectionViewCell的设计,可以参考《iOS开发实战——CollectionView点击事件与键盘隐藏结合案例》《iOS高级开发——CollectionView修改cell的文本及模型重构》这几篇博客。但是今天还是需要来讲讲CollectionView实现中的一个小小的坑,这是我最近在网上浏览时发现很多开发者经常
2016-06-21 01:06:59 24475
原创 iOS开发实战——CollectionView点击事件与键盘隐藏结合案例(二)
我在前一篇博客中《iOS开发实战——CollectionView点击事件与键盘隐藏结合案例》详细实现了CollectionView与键盘组合操作中出现的多种情况,并解决了交互体验上的一些问题。在实际项目中也的确可以采用这种方法来操作。但是问题来了,原来的界面我们是使用UIView来操作的,也就是界面是不可滚动的。然而更为常见的场景是一个ScrollView,界面可以进行上下滚动。所以,这篇博客主要
2016-06-06 00:56:09 9200
原创 Mac上gif图制作工具Giphy Capture介绍与使用
在我们写博客过程中,可能程序需要进行演示效果,单单放一张静态图很难让别人知道程序是做什么的。如果我们能在文章插入一些gif动图的话,意思的表达效果会更好,使你的代码和程序都更容易理解。今天我就给大家推荐一款Mac上制作gif图的工具—— Giphy Capture。现在已经是2.2版本了,原来的旧名字是GifGrabber。可以从App Store上免费下载到。对于制作Gif图,有的是用多张图片制
2016-06-05 16:25:05 10997 1
原创 iOS开发实战——CollectionView点击事件与键盘隐藏结合案例
在我们的实际开发中,CollectionView是一种非常实用而又稍难的控件,如果想要在复杂的场景下使用,则需要考虑的比较全面。如果又在CollectionView添加其他的控件,比如在cell里面再添加一个按钮,那么点击触发的事件前后顺序就非常重要了。再者,如果一个界面中包含了一个输入控件,需要弹出键盘时,键盘遮挡对于界面上的其他控件的使用就会造成较大的影响。今天我的案例具体需求描述下:界面中有
2016-06-05 13:06:16 7207 2
原创 iOS开发中的UDID和UUID详解
今天突然想和大家聊聊UDID和UUID的问题,虽然平时我们对这两个东西很忽视,往往也很难区分这两个东西。今天就来好好谈谈。【UDID】 UDID的全名为 Unique Device Identifier :设备唯一标识符。从名称上也可以看出,UDID这个东西是和设备有关的,而且是只和设备有关的,有点类似于MAC地址。我在上一篇博客中《iOS应用发布流程详解》提到了真机调试,然后需要把U
2016-05-29 15:28:39 32356 6
原创 iOS应用发布流程详解
这篇博客将会以一个完整的过程来实现一个iOS App提交审核的过程。在这个过程中,我们会涉及到证书、代码签名、授权文件、真机调试、开发者账号等一些概念,我也会有所解释。推荐大家先去看《iOS应用分发与内测(一)》《iOS应用分发与内测(二)》《iOS开发Provionsioning Profile解析》这几篇博客,看完以后会对发布App的流程非常熟悉。我先对一些概念做一个讲解:【证书 Certif
2016-05-28 17:05:15 12621
原创 响应式编程框架ReactiveCocoa学习——框架概览
这篇博客将会继续翻译RAC的官方文档Framework Overview. 主要是对RAC这和框架进行概览的介绍和学习。同时也可以参考我前面的两篇翻译《响应式编程框架ReactiveCocoa学习——基本操作符》《响应式编程框架ReactiveCocoa介绍与入门》。其中ReactiveCocoa的Github官方地址为 https://github.com/ReactiveCocoa/React
2016-05-22 23:14:35 8876
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人