自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 资源 (5)
  • 收藏
  • 关注

原创 快速排序 --- 排序算法5

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。虽然最坏情况的时间复杂度达到了 O(n²),但是人家就是优秀,在大多数情况下

2020-07-31 17:52:15 127

原创 归并排序 --- 排序算法4

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序, 每次的小循环和合并2个有序链表有点类似. 1.把原始数组看成n个小数组组成的,每个小数组都是有序的, 2.相邻的2个数字合并成一个有序数组, 3.相邻的4个数字合并成一个有序数组, .... 最后所有数字合并变成一个有序数组.- (void)sortAction { ...

2020-07-31 16:04:50 114

转载 用GCD构造线程安全的类

到目前为止,我们已经了解到,在多线程的程序中,数据读写访问的操作必须被某种同步机制保护着。我们使用GCD同步队列来确保这个过程。我们也讨论了如何使用并发队列实现一个读写锁。为了让这篇文章更简单易懂,这里我继续使用串行队列。一个始终存在的问题:不论是谁访问了你的数据都必须使用dispatch_sync()来确保线程安全,否则就会得到错误的结果。尤其是当你的代码被某个不熟悉你的用意的人使用时(比如,你的代码是某个框架的一部分),这个问题将尤为明显。如果我们能够将访问数据的同步操作封装起来是不是很

2020-07-30 15:49:15 574 1

转载 为什么选择GCD

Grand Central Dispatch(GCD)是OS X 10.6和iOS 4引进的一个重要的系统库,它提供了一系列C的API,方便我们在iOS和OS X上处理并发编程。GCD支持C,C++,Objective C和Swift。当你开始了解GCD的时候,你会发现2件事:它的API相当简洁,并且在它的介绍资料里没有任何难点。有一份易懂的介绍资料通过一些基本模式来指导你学习GCD,难道不是很好嘛?那就是这一系列文章要做的。我从很早就开始使用GCD了,也跳过很多坑,我希望我能引导你学习这一强大而优

2020-07-29 19:00:11 247

原创 GCD知识补充.目标队列+GCD循环

通常我们会用for循环遍历,但是GCD给我们提供了快速迭代的函数dispatch_apply。dispatch_apply按照指定的次数将指定的任务追加到指定的队列中,并等待全部队列执行结束。如果是在串行队列中使用 dispatch_apply,那么就和 for 循环一样,按顺序同步执行。可这样就体现不出快速迭代的意义了。我们可以利用并发队列进行异步执行。比如说遍历 0~10 这10个数字,for 循环的做法是每次取出一个元素,逐个遍历。dispatch_apply 可以 在多个线程中同时(异步)

2020-07-29 18:03:35 1119

原创 @synthesize到底对属性干了什么, 使用场景总结

synthesize的意思是 "合成".Xcode4时,@property只能生成getter、setter方法的声明, 需要手动加上@synthesize,才会有set\get的实现,以及对应的变量_propertyName;property = setter方法声明 + getter方法声明synthesize = ivar + setter实现 + getter实现从Xcode5开始, 编译器有了自动合成机制,@property可以自动生成_propertyName成员变量和ge.

2020-07-28 15:27:34 2377 1

转载 什么是ABI? Swift ABI稳定有什么用?

一、ABl是什么每个操作系统都会为运行在该系统下的应用程序提供应用程序二进制接口(Application Binary Interface,即ABI), 描述了应用程序和操作系统之间,一个应用和它的库之间的接口。与API不同的是:ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行,而API则是定义 源代码 和 库 之间的接口,同样的代码可以在支持这个API的任何系统中编译。ABI包含了应用程序在这个系统下运行时必须遵守的编程约定。ABI总是包含一系列的系统调用和使用这些系统调用的..

2020-07-26 17:25:43 4223

原创 希尔排序 --- 排序算法2

先从直接插入排序说起,直接插入排序的效率在某些时侯是很高的,比如,我们的记录本身就是基本有序的,我们只需要少量的插入操作,就可以完成整个记录集的排序工作,此时直接插入很高效。还有就是记录数比较少时,直接插入的优势也比较明显。 希尔排序是直接插入排序的改进版, 首先它把较大的数据集合分割成若干个小组(逻辑上分组),然后对分组就行直接插入排序, 把大规模无序数据转成了基本有序数据, 降低了时间复杂度 , 希尔排序是第一批突破O(n^2)的排序算法之一。 比如0到100,第一次分组间隔...

2020-07-24 11:31:18 141

原创 二叉树中找出2个节点的最近公共祖先

给定二叉树和两个节点n1和n2,编写程序以找到他们的最近公共祖先。在做这个之前, 有些东西需要提前问清楚, 二叉树是不是二叉搜索树, 如果是二叉搜索树, 那就好处理多了. 在保证2个节点都属于此二叉树的情况下.由于二叉搜索树是排序过的, 位于左子树的结点都比父结点小, 而位于右子树的结点都比父结点大, node.data>node.left.data &&node.data>node.right.data , 我们只需要从树的根结点开始和两个输入的结点进行比较。如..

2020-07-18 12:13:28 2138

原创 判断扑克牌能否组成顺子

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。组成顺子有一些条件是必须要满足的,1.除了大小王之外, 其他牌不能重复2.除了大小王之外, 最大值-最小值==4(没有零), 最大值-最小值==3或4(有1个零), 最大值-最小值==2或3或4(有2个零) , 但是看到了别人的优化版, 这几种情况可以统一为最大值-最小值<5即可, 不需要看0个数量tip : 使用se...

2020-07-16 11:53:58 2254

原创 求n个骰子的点数和

把n个骰子仍在地上,所有骰子朝上一面的点数之和为s。输入骰子个数n,求所有s出现的概率。最直接的方法, 把所有的情况都列出来, 然后统计出现和的次数, 用次数/6^n就是对应的概率.用一个数组装所有的可能, 递归调用装满数组, 当数组的大小等于n的时候说明装满了, 对数组计算一次和, 并存入到字典. 然后在处理字典, 用value/6^n 就是对应的概率了.- (void)viewDidLoad { [super viewDidLoad]; [self proba..

2020-07-15 18:44:44 1502

原创 排序数组求和为s的组合

输入一个递增排序的数组和一个数字s,在数组中査找两个数,使得它们的和正好是s。例如,输入数组{1、2、4、7、11、15}和数字15。由于4+11=15,因此输出4和11。很多人都能立即想到O(n^2)的方法,也就是先在数组中固定一个数字,再依次判断数组中其余的n-1个数字与它的和是不是等于s。但是这样是不会让面试官满意的.我们试着想更好的方法, 在数组中选择头部和尾部的2个数字,如果它们的和等于输入的s,我们就找到了要找的两个数字。如果和小于s呢?我们希望两个数字的和再大一点。由于数组已经排.

2020-07-14 11:11:01 962

原创 两个链表的第一个公共节点, Masonry寻找2个view的公共父视图

输入2个链表, 找出他们的第一个公共节点.这两个链表是单向链表。如果两个单向链表有公共的结点,那么这两个链表从某一结点开始,它们的next都指向同一个结点。但由于是单向链表的结点,每个结点只有一个 next,因此从第一个公共结点开始,之后它们所有结点都是重合的,不可能再出现分叉。所以两个有公共结点而部分重合的链表,拓扑形状看起来像一个Y,而不可能像ⅹ。先用最直观的暴力法, 遍历第一个链表, 把第一个链表的每个元素依次拿出来, 与第二个链表中的元素的元素进行比对, 地址相等就说明找到了. M...

2020-07-12 12:25:12 919

原创 找到第1500个丑数

把只包含质因子2、3和5的数称作丑数。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。暴力的一点的方法, 可以从1开始遍历, 依次判断是否是丑数, 如果是丑数, 计数器+1, 当计数器加到1500的时候, 这个数字就是丑数了.- (void)viewDidLoad { [super viewDidLoad]; [self findUglyNum]; }// 找到丑数- (void)

2020-07-10 15:32:08 403

原创 把数组排成最小的数

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/输入: [10,2]输出: "102"输入: [3,30,34,5,9]输出: "3033459"先考虑下数组里的元素都是个位的情况, 比如 1,3,7, 5 , 排序结果肯定是1357, 最高位置上放最小的数字, 然后放第二小, 第三小的数字.所.

2020-07-09 22:57:36 253

原创 从1到N整数中1出现的次数

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。https://leetcode-cn.com/problems/number-of-digit-one/示例:输入: 13输出: 6解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。能想到最直观的方法(说实话 ,我没想到 , 第一眼我认为这是一个数学题, 根本没有想到用计算机的思路解决问题), 也就是累加1到n中每个整数1出现的次数。我们可以每次通过对10求余数判断整数的个位数字是...

2020-07-09 11:26:25 4392 3

原创 找出乱序数组中最小(最大)的k个数字

输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数。这种思路的时间复杂度是O( nlogn),显然不太能让面试官满意.首先这个是需要进行排序的, 但是不需要把所有的数字都排序, 只要部分排序即可, "快速排序法"中重要的一步就是查找基准数, 是基准数左边都比基准数小, 基准数右边都比基准数大, 如果能找到这个数字, 使得左边的数字为k个(或者k

2020-07-06 17:37:42 1714

原创 枚举字符串的排列, 八皇后,枚举&回溯2种解法

输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc, acb , bac、bca, cabcba。由于字符串的长度不同, 使用for循环嵌套枚举是不行的, 需要使用递归才能处理不定长度的字符串.需要把字符全排列, 每个字符都可能出现在第一位置, 可以看成 完整字符 = 单个字符 + 剩余字符的全排列 , 剩余字符的全排列 = 单个字符 + (剩余字符-单个字符)的全排列, 这样下去,剩余字符会越来越少, 当剩余字符没有...

2020-07-03 19:47:36 910

转载 仿写《今日头条》的tag选择页面

在《今日头条》中,该页面是用来选择自己感兴趣的频道标签从而改变segment的。标签功能应用的需求现在也比较多,主要使用collectionview中item可以移动的方法和思路来写这样的页面。关键点 在collectionview上添加的长按手势 手势状态的变化和操作 手势开始移动的时候调用此方法,可以获取相应的datasource方法设置特殊的indexpath 能否移动,如果能移动返回的是YES ,不能移动返回的是NO- (BOOL)beginInter...

2020-07-03 18:46:08 669

原创 二叉搜索树转换成双向链表

输入一棵二叉搜索树,将该二又搜索树转换成一个排序的双向连表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如入图4.12中左边的二叉搜索树,则输出转换之后的排序双向链表。首先是需要遍历这个二叉树的 , 前序/中序/后序 , 选择中序比较合适, 因为中序是 左 - 根 - 右, 正好是对应的升序排列, 在考虑每一个节点需要怎么处理.分析最简单的情况, 假设只有4-6-8 这3个节点,对4节点来说, 需要把rightNode指向根节点(下一个节点),leftNode不需要处理;对6

2020-07-02 17:23:21 467

原创 复杂链表的复制-OC实现2种方式

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点,虚线部分),返回结果为复制后复杂链表的head。解题思路:1、遍历链表,复制链表中的每个结点,并将复制的结点插入到该结点的后面。例如,原链表为A->B->C, 遍历完毕后,链表变为A->A'->B->B'->C->C',其中A‘,B',C'是结点A,B,C的复制结点。看图中,蓝色箭头为next指针:复制结点后:2、为复制结点的r..

2020-07-02 11:04:20 484

原创 求二叉树的路径和

给定一个二叉树,找出所有路径中各节点相加总和。一个有效的路径,指的是从根节点到叶节点的路径。这样就是一条有效的路径,求这个路径上值的和,已经对应路径上的值.二叉树的节点定义, 根据传入数组,生成对应的完全二叉树@interface TreeNode : NSObject /// 根据数组生成一个完全二叉树+ (TreeNode *)nodeWithDataArray:(NSArray *)dataArray;/// 生成一个节点,左右节点为nil+ (TreeNo...

2020-07-01 12:04:29 959

ios swift 直播动画demo

swift的 , 会OC的看无压力 , 直播中送礼物的动画, 写了常见的4种 , 包括 同时收到多个礼物时 , 展示位不够 的处理 , 可以到cocoaChina上找,那里不要积分

2018-07-04

NSArray越界崩溃解决方法

比较完美的解决了数组越界的问题, 在debug模式下会崩溃 , 在release不会崩溃 , 开发过程中 , 方便调试 , 正式环境中 减少崩溃.

2018-05-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除