自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 iOS多线程之GCD

一、基本概念GCD 全称 Grand Central Dispatch,又称大中央调度,对线程操作进行了封装并提供简洁的C语言接口1. 串行队列与并发队列串行队列:任务按 FIFO 的顺序执行,同一时间只执行一个任务,按FIFO的顺序执行完毕并发队列:任务按 FIFO 的顺序开始执行,同一时间可执行多个任务,任务完成的顺序不可预测2. 同步派发和异步派发GCD将 block 任务块派发到指定队列中执行,有同步、异步两种方式1. 同步派发 dispatch_sync会阻塞当前线程

2021-01-29 14:25:26 308 1

原创 TopK问题-优先队列和基于partition减治、自己实现堆调整3种方法

牛客NC88-寻找第K大Leetcode 215-数组中第K个最大元素思路1:求第k大,维护一个小根堆,用优先队列priority_queue过程:向小根堆中插入k个数,遍历剩下的n-k个数,当前数比堆顶大时,交换他们的值。这样遍历完,堆顶是小根堆k个数中最小的,且比剩余的n-k的数都大,因此堆顶即为所求;此外,小根堆中所有的数是整个数组的前K大。代码如下(Leetcode 215):class Solution {public: int findKthLargest(vector&

2020-11-16 10:51:59 345

原创 用C++实现split分割字符串

前几天做到一个牛客NC113-验证IP地址的题目,用python和Java都可以轻松的调用库函数来实现字符串的分割,分别验证每一个token是否合法。奈何C++标准库中没有这个函数,那就自己来实现一下。首先,回忆一下C++带有空格的输入流的读取,用getline来实现,getline默认遇到回车\n而非空格而结束读取。①getline用法如下(引自cplusplus.com)(1) istream& getline (istream& is, string& str, char

2020-11-04 22:23:31 812

原创 用unordered_map和双向链表实现LRU缓存

LRU为最近最少使用算法,可以类比为手机app多任务管理来理解,每个app刚用完在会被放在最前面,当内存满时,最久没用的app内存会被释放,题目链接如下:Leetcode 146-LRU缓存机制题目要求:put和get操作时间复杂度为O(1)分析:首先,这些key-value的数据应该按时间顺序排列,链表是有序的;但链表查询时间为O(n),无法满足要求;哈希表查询时间为O(1),但是无序的。因此可以用哈希表来存储key和链表节点指针的映射;每次最新访问或存储的数据放在链表的头部,当cac

2020-11-04 21:13:32 309

原创 NSOperation的串行、并行及自定义NSOperation的使用

1. NSBlockOperation使用start使用start直接调用是同步的,在当前线程执行#import <Foundation/Foundation.h>int main(){ //Demo1: start NSLog(@"当前线程是%@",[NSThread currentThread]); NSBlockOperation *blockOperation1 = [NSBlockOperation blockOperationWithBlock:

2021-05-07 16:51:18 495

原创 在macOS上使用OpenSSL库(x86、iOS arm64两种)

1. 注意macOS移除了openssl库,要使用需要将编译好的静态库(.a文件)进行静态链接不同平台上的需要的静态链接库文件不一样,很多教程没有说明是针对哪个平台的,X86和iOS开发(arm64)所需的静态链接文件是不一样的,路径设置也不同2.必备的文件openssl文件夹中包含静态库lib及头文件include静态库中之需要包含libssl.a 与 libcrypto.a两个文件3. 通用的部分都需要将包含lib和include的openssl文件夹添加到项目中,注意用拷贝而

2021-04-29 20:57:19 3395 1

原创 unsigned char转为16进制字符串、以及C++的std:string转为OC的NSString

需求调用C++的openssl/md5的API,计算文件的md5,函数如下:int MD5_Final(unsigned char *md, MD5_CTX *c);最终得到的md5值是一个128bits 的unsigned char数组,即16个字符,md5值一般表示为16进制的32位字符串,即每个unsigned char表示为2个字符的Hex字符串封装的这个接口输入为PHAsset或NSURL,返回值为NSString,因此最终需要将C++的string转为Objective-C的NS

2021-04-27 12:41:57 4396

原创 通过localIdentifier获取iOS相册的视频文件及指针

步骤1. 通过localIdentifier获取PHAsset2. 通过PHAsset获取AVAsset3.通过AVAsset获取文件的相对路径4.直接使用C语言的文件API访问这个文件 NSString *localID = @"230CF8EB-8ABD-4C0F-A289-6D909C23B63A/L0/001"; PHFetchResult *result = [PHAsset fetchAssetsWithLocalIdentifiers:@[localID] option

2021-04-25 17:33:39 888

原创 关于addChildVC、removeFromParentVC的生命周期问题

1. 场景需要将ViewController B作为childVC添加到ViewController A [superVC.view addSubview:childVC.view]; [superVC addChildViewController:childVC]; [childVC didMoveToParentViewController:superVC];为什么要调用- (void)didMoveToParentViewController:(nullable UIViewContro

2021-04-22 15:13:40 626

原创 iOS富文本与UILabel动态调整高度的场景、注意事项和示例

场景弹出的卡片View,有多个UILabel,每个UILabel可能有1~2行文字除了UILabel还有UIImageView、UIButton等控件根据UI提供的sketch中相邻UI控件的高度(cur.top = last.bottom + distance)最后可以得出整个卡片view的height因此需要根据文字动态的调整UILabel的行高方法试了好几种方法,有一种比较好用- (CGRect)boundingRectWithSize:(CGSize)size options:

2021-04-20 11:02:09 665

原创 NSString的stringWithFormat用法

stringWithFormat的用法类型转换NSInteger转为NSString,获得unix时间戳,占位符为%zd NSTimeInterval timeInterval = [[NSDate date] timeIntervalSince1970]; NSInteger timeStamp = timeInterval; NSString *timeStampString = [NSString stringWithFormat:@"%zd",timeStamp];u

2021-04-09 14:58:59 1408

原创 NSMutableString的用法

创建NSMutableString首先是NSString的子类,因此可以用NSString的方法创建 NSInteger number = 20; NSMutableString *string = [NSMutableString stringWithFormat: @"Hello World %zd", number];NSMutableString是长度可变的,可以一开始指定一个长度,这只是一个建议的值,会随着拼接的字符串动态的增加 NSMutableString *stri

2021-04-09 12:13:17 168

原创 Objective-C使用SHA256、Base64(对比python)

1. stringWithFormat的用法类型转换NSInteger转为NSString,获得unix时间戳,占位符为%zd NSTimeInterval timeInterval = [[NSDate date] timeIntervalSince1970]; NSInteger timeStamp = timeInterval; NSString *timeStampString = [NSString stringWithFormat:@"%zd",timeStamp];

2021-04-08 21:35:38 490

原创 可变容器的深浅拷贝问题

结论copy自不可变、或者mutableCopy自可变、不可变的容器,都是容器对象的深拷贝上面的深拷贝只是容器对象,容器里的值还是浅拷贝的使用copy修饰property、直接copy 可变字典两种情况,查看容器对象和容器里值的地址情况://TestObject.h#import <Foundation/Foundation.h>@interface TestObject : NSObject@property(nonatomic, copy) NSDictionary

2021-04-07 14:27:22 76

原创 快速排序/堆排序/归并排序总结(C++版)

1. 快速排序平均/最好时间复杂度O(nlogn),最坏时间复杂度O(n^2),不稳定工作过程:区间内只剩一个/没有数时,结束递归找区间左端当作参考值 ref 进行划分 partition ,并得到 ref 应该在的index;划分后 index 左边的都比 ref 小,右边的都比 ref 大对 index 左右递归的进行快速排序快排代码:#include<iostream>#include<vector>using namespace std;void

2021-03-19 10:54:57 331

原创 block的循环引用问题

循环引用示例block会对block中的对象进行持有操作,如果block中的对象又持有了该block就会造成循环引用典型的场景就是block作为self的属性使用时,又在block调用了self的属性或方法,代码如下// Test.h#import <Foundation/Foundation.h>typedef void (^MyBlock)();@interface Test@property(nonatomic,copy) MyBlock blockTest;@

2021-02-09 13:08:22 246

原创 ObjC的isa指针与消息传递机制

isa指针ObjC中有3个层次的对象:实例对象Instance、类对象Class、元类MetaClassClass即自定义的类,是实例对象的类对象,类对象又是对应元类的实例对象,它们的关系图如下isa指针的作用是可以通过它找到对应的类对象或元类中的方法,例如Instance对象可以在其类对象中找到它的实例方法,Class对象可以在元类中找到它的类方法类方法与实例方法类方法属于类对象,用+号修饰,类似于C语言中的static方法(可以用无需实例对象而用类名访问、只能调用类方法而不能调用实例方

2021-02-09 12:24:07 114

原创 Category与Extension

1. Category1.1 定义与特点ObjC语言的一个灵活的类扩展机制,可以在不知道原有代码的基础上向一个已存在类添加新的方法不能修改、删除已有方法,对扩展开放、对修改封闭,体现了面向对象的OCP原则,降低了代码的耦合度。类别扩展的新方法有更高优先级,会覆盖类中已有的同名方法;声明的方法可以不实现,但不实现时不可以调用此方法1.2 关于添加变量只能添加扩展方法,不能添加成员变量因为Category是运行期决议,运行时对象的内存布局已经确定,objc_class结构体大小已确定,无法再

2021-02-09 12:14:14 104

原创 ObjC的property修饰符与深浅拷贝

1. property1.1 定义及用法property相当于 ivar + 存取方法默认生成getter、setter以及带下划线的变量名,使用点语法可以调用存取方法点语法在左边时调用setter,就是把右边的值赋给self.xxx,相应的点语法在右边就是调用getter1.2 几种修饰符读写语义:readonly:表示修饰的属性只读,只有getter没有setterreadwrite:修饰的属性可读可写,既有getter也有setter默认读写语义参数为readwrite原子

2021-02-09 11:55:18 147

原创 iOS Demo-Movie Searcher

1. 简介1.1 APIhttps://www.omdbapi.com/是一个获取电影数据的API网站获取的Json如下:1.2 数据结构根据Json设计数据结构如下:Swift 4引入了Codable协议,与NSCoding协议不同的是:如果自定义的类中全都是基本数据类型、基本对象类型,无需再实现编解码,只需要在自定义的类声明它遵守Codable协议即可原Json中的Type与Swift的关键字冲突了,使用CodingKeys替换变量名struct MovieResult: Co

2021-02-08 16:56:42 206

原创 UITabBarController嵌套UINavigationController切换页面

1. 都是视图控制器的管理容器UINavigationController以栈的形式保存视图控制器,使用push将视图控制器入栈、pop移除栈顶控制器,pop后视图控制器对象会被释放UITabBarController用于不同视图控制器间的切换,切换视图时视图控制器不会被销毁,通常作为整个程序的rootViewController下面是苹果推荐的方式将导航控制器嵌套在UITabBarController中,能够在不同的标签项里实现不同的层次结构...

2021-02-07 23:11:50 435

原创 iOS从网络获取Json并解析

Demo代码地址:JsonRequest1. 简介一个获取日出日落时间的API网站Sunset and sunrise times API提供API,为给定的经纬度提供日出日落时间等效果URL:https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400返回的Json数据 {"results": {"sunrise":"7:14:21 AM", "sunset":"5:49:11 PM".

2021-02-07 00:17:25 772

原创 iOS解析本地Json

Demo代码地址:FileParsingJson1. 本地Json文件与运行效果{ "jsonData": [ { "title": "水果", "items": [ "苹果", "香蕉", "梨", "西瓜" ] }, { .

2021-02-06 22:04:34 717 1

原创 待办清单-iOS项目说明

1.功能与ViewController介绍(补充图)1. 查看已有待办分类,并可以新增、编辑待办分类,并为该分类选择图标每个分类显示其中还未完成的项目,这是AllListsViewController新增、编辑待办分类,这是ListDetailViewController为分类选择图标,这是IconPickerViewController2. 每个分类中有它的待办清单,可以新增、编辑待办事项,并可选择提醒时间、是否提醒可以点击行来标记是否完成该事项,这是ChecklistsV

2021-01-26 22:05:54 687 2

原创 双端单调队列解决队列最大值、滑动窗口最大值问题

题目1:队列中的最大值分析:此题求队列中的最大值,队列的特点是先进先出,因此在一个数字入队时,比它先进且比它小的数字不会对答案产生影响。举个例子,比如当前队列是1、2、3、4,下一个入队的是6,按照出队顺序,如果1、2、3、4还在队列中,那么比它晚入队的6必然也在队列中,取最大值轮不上1、2、3、4。基于这个特点,可以在每次入队前舍弃掉队列中比该数小的数,使得队列中仅保留对结果有影响的数字。等价于维护一个辅助的单调递减队列,入队时要从尾部弹出比当前数小的,因此必须是双端队列。①入队过程:队

2021-01-18 21:38:08 197

原创 判断一个字符串是否表示数值

题目链接,描述如下:解题思路:把一个数字分为三个部分,num1 . num2 e/E num3其中,num1和num3是可以有符号的,num2是无符号整数;①首先扫描第一部分,判断其是否是整数②如果遇到 在这里插入代码片...

2021-01-18 16:03:03 357

原创 macOS使用LLDB调试coredump

对于segmentation fault或者异常退出的程序,macOS中使用lldb调试工具(linux里是gdb)可以更方便的判断问题出在哪里,如下:①打开core文件生成开关(注意这个仅在当前terminal窗口有用),unlimited表示不限制core文件大小,可以使用-c查看是否开启,默认是0ulimit -c unlimited②使用g++编译cpp文件并执行a.out文件,-g参数表示生成调试信息;可执行文件默认名为a.out,可以用-o参数自定义。g++ test.cpp -g

2020-12-16 23:17:32 3211

原创 单词规律-split + 找第一次出现的下标,无需哈希表

题目链接如下:Leetcode 290-单词规律思路:①首先对str进行split,得到包含所有token的vector,名为res②对于pattern字符串,用string的find方法找到每一个字符出现的第一个位置比如:egg 对应的是 011str 对应的是 012wwo 对应的是 001③对于token的vector,用algorithm库中的find方法找到每个token出现的第一个位置(迭代器),减去res.begin(),即第一次出现的下标。比如:dog cat ca

2020-12-16 10:54:55 273

原创 符合目标和的二叉树路径及扩展问题-leetcode 113、437

题目链接如下:路径总和 II路径综合 III先看第一个,题目描述如下:这道题路径是从根节点开始,到叶子结点结束,因此要递归到叶子结点才判断路径和是否符合。用数组tmp存每个符合目标的路径,二维的res存最终结果。分情况讨论:①空节点直接返回 if(!root) return;不是空节点:更新curSum、当前路径容器tmp tmp.push_back(root->val); curSum+=root->v

2020-12-15 14:54:30 111

原创 逆序/翻转对与归并排序-剑指offer 51、leetcode 493

题目链接如下:Leetcode 493-翻转对剑指Offer 51-数组中的逆序对两个题目类似,以493题为例:暴力解法即进行两层遍历,时间复杂度为O(n^2),这显然不符合要求。为了实现更低的时间复杂度,使用递归的归并排序。思路:①求出中间位置mid,对 [left, mid] 、[mid+1, right] 两个区间分别做归并排序,并返回左右两个区间的逆序对数。②所求 = 左区间逆序对数 + 右区间逆序对数 + 左右之间的逆序对数。③对两个区间进行合并,并返回上一层递归。递归结束的条

2020-12-15 10:36:10 160

原创 验证 IPv4 / IPv6 地址(C++) -Leetcode 468

这道题本来很早就刷了,还把C++的split实现单独写了一篇,由于拖延症晚期一直没总结,下面进入正题首先题目链接如下Leetcode 468-验证IP地址牛客 NC113-验证IP地址题目要求如下:思路:(1)首先IPv4和IPv6的判断要分为两个不同的函数,根据传入string中.、:的数量决定传入哪个函数,还是直接返回"Neither"(还好C++的algorithm库中自带count,要不什么都要自己造轮子实在有点难受hh)代码如下: vector<string> res

2020-12-10 18:04:32 2094

原创 关于搜索二叉树与中序遍历

一般搜索二叉树的题都可以用中序遍历做,今天又做了一道题,发现有一些小细节需要注意,总结一下。(1)首先是一道很直接的题,判断一颗树是否为二叉搜索树。如①牛客NC60-判断一颗树是否为搜索二叉树及完全二叉树②Leetcode 98-验证二叉搜索树有一种比较常见的错误思路:用递归的思想,首先判断当前的节点是否满足大于左孩子 && 小于右孩子;若符合,再递归判断它的左右子树是否均为二叉搜索树,写成代码如下:bool isSerch(TreeNode* root){ if(!r

2020-10-31 21:02:41 1440 1

原创 priority_queue、自己实现堆调整两种方式,求数据流中的中位数

题目描述如下:要求插入的时间复杂度是O(logN),取中位数的时间复杂度是O(1)想到用优先队列priority_queue,插入时可以动态实现堆的调整思路:用大根堆存 <=中位数的那部分数,smallPart,存n/2个用小根堆存 >= 中位数的那部分数,bigPart,存n/2或n/2+1个 priority_queue<double> smallPart;//大根堆存储小的那部分 priority_queue<double,vector<doub

2020-10-23 15:14:56 374

原创 数组作为哈希表-leetcode 763、leetcode 1002

今天的每日一题Leetcode 763-划分字母区间用到了用数组存储的哈希表,index为小写字母的序号(ch-‘a’),value为最后出现的位置题目描述思路:初始化区间下界start、end均为0。遍历整个字符串,根据每个字母出现的位置更新上界end,因为要保证只有当前区间有这个字符,所以上界end要取max(end, last[S[i]-'a'])代码如下:class Solution {public: vector<int> partitionLabels(stri

2020-10-22 10:15:31 183

原创 中缀表达式转为逆波兰式并求值(牛客NC137-表达式求值-C++实现)

今天刷牛客遇到一个表达式求值的题,题目链接如下:牛客NC137-表达式求值这道题与Leetcode 224-基本计算器类似,但Leetcode这道题没有要求乘法涉及到编译原理的内容,后缀表达式计算起来比较容易,复习了一下将中缀表达式转化为后缀表达式的方法。①要用到两个stack:一个放数字、一个放运算符,由于数字可能有多位,且存在运算符栈顶pop后向数字栈push的情况,因此两个stack数据类型定义为string。②由于放数字的栈存放最后后缀表达式,且需要一次弹出逆序,果断一开始就用queue来

2020-10-21 22:33:03 807

空空如也

空空如也

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

TA关注的人

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