- 博客(42)
- 资源 (1)
- 收藏
- 关注
原创 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。要搞明白二叉搜索树的概念,二叉搜索树(BST),主要用来实现搜索,它的左子树元素小于根节点的元素,右节点的元素大于根节点的元素。普通二叉树的搜索时间复杂度为O(n),二叉搜索树的平均搜索时间复杂度变为O(logn)。搜索二叉树举例:按照题目要求,最终的结果应该为: 可以看到这个顺序和二
2017-06-22 08:48:20 446
原创 封装好的可设置标题、正文字体的默认样式UIAlertController
iOS8之后,主要使用UIAlertController进行信息的显示,而默认的样式使用的比较多,所以封装了一个,以方便以后使用。调用以下函数即可:-(void)showIntroDuction:(NSString *)title :(NSString *)showText :(NSString *)btnStr :(UIFont *)titleFont :(UIFont *) showTextFo
2017-06-14 11:10:05 593
原创 UITableViewCell以及其子控件自适应高度
项目中有一个需求如下图所示:这是已经的收件箱的cell显示。 另外一种是未读的收件箱的显示,如下图所示:对于未读的信息的显示,最开始考虑的是将前面的小圆点设置成一个UIImageView,然后后面用UILabel显示正文。但是这样有一个问题就是,第二行的文字和第一行是对齐的,并不是从小圆点的正下方开始显示。而且也不想未读和已读自定义两种cell。 所以最终选择了富文本的方式解决这个问题。在完成这
2017-06-13 22:05:22 612
原创 iOS 实时监听UITableViewCell中的UItextField的值的变化
项目中有一个需求:每一个UITableViewCell中有一个UItextField,当所有的UItextField输入完成后,点击保存按钮,上传信息。 在这个过程中,只要任意一个cell中的UItextField的输入发生变化,就要得到UItextField中的值,并对当前控制器中的相应属性进行赋值。其中有两个cell是选择国家和省市的,点击这两个cell需要弹出一个控制器,点击相应的选择后,发
2017-06-12 10:09:04 5141 2
原创 iOS AFNetWorking与线程同步
在iOS开发中,页面的数据并不是通过一个接口进行获取的,有时候需要从服务器的多个接口获取数据,然后进行页面的更行,有时候需要在获取一个接口的数据后,根据得到的数据再获取其他接口的数据。而开源框架AFNetWorking是一个常用的强大的第三方框架,我们可以利用AFNetWorking和GCD结合的方式完成以上两个需求。(1)获取多个接口数据后,创建或者reload UITableview。将网络获取
2017-05-15 08:34:44 2499
原创 复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)这个题的思路1: 从头遍历遍历原链表,第一次遍历只存储链表的前后关系,不存储他的random节点关系。 第二次再遍历,存储他的random节点,这样的时间复杂度是n平方。思路二:每遍历
2017-05-10 12:52:00 358
原创 iOS点击“我的”,保持登陆状态
项目中需要,在点击“我的”时,检测用户是都登陆,如果没有登陆,就跳转到登陆、注册页面,否则直接进入我的主页面。 项目采用的是登陆时,返回一个token,所以每次登陆时,我都存储token,然后去判断token是否过期,如果过期就进行重新的登陆,否则直接进入我的主控制器。在点击“我的”这个tabbarItem时,会调用-(BOOL)tabBarController:(UITabBarControll
2017-05-09 22:41:45 762
原创 二叉树中和为某一值的路径
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。路劲指的是从根节点开始到叶子节点的一个通路,所以首先必须访问根节点,在几种遍历树的方法中,前序遍历的顺序是根->左->右。所以,我们采用前序遍历,首先访问根节点,然后访问根节点的左孩子。这个时候,我们的当前节点就是左孩子,最开始的根节点就无法访问,所以需要用一个
2017-05-09 09:57:37 397
原创 iOS 利用token保持登陆状态
项目里,需要在客户登陆后保持登陆状态。使用的不是存储用户名和密码,每次去模拟登陆。 而是登录时,登陆成功,从服务器接收token,token是服务器生成的一个字符串,唯一标识一个用户,并且会在一段时间后销毁,所以我们很久不登录APP,会要求重新登录。利用一个工具类,进行token的存储、删除和读取。登陆成功进行存储、下一次打开APP进行读取、退出进行删除。如果,有refreshtoken,可以进行
2017-05-08 09:29:25 6815
原创 二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。首先要搞清楚二叉搜索树,二叉搜索树不同于一般的二叉树,它是有顺序的,总的来说是 左子树<根节点<右子树。如下图: 而后序遍历的顺序是:左子树、右子树、根节点。上图二叉搜索树的后续遍历结果是:{2,9,5,16,17,15,19,18,12}可以发现,根节点总是
2017-05-08 09:21:12 2428
原创 从上往下打印二叉树
从上往下打印出二叉树的每个节点,同层节点从左至右打印。这其实就是二叉树的层次遍历: (1)访问根节点 (2)在访问第i层的时候,将i+1层的节点按顺序保存在队列中; (3)进入下一层并访问该层的所有节点; (4)重复以上操作,知道遍历完所有节点。这里要注意,Java中的队列: LinkedList实现了Queue接 口。所以用LinkedList。 主要方法:add 增加一
2017-05-04 11:27:47 268
原创 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)设定辅助栈,如果当前弹出的数字刚好是栈顶数字,就直接弹出,如果不是栈顶数字,就继续压栈,如果找到了相等的
2017-05-04 09:36:21 280
原创 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。栈的特点是先进后出,所以要求min的时间复杂度是1,就必须将最小的元素时刻放在栈顶,那么我们考虑每次压栈的时候,将当前要压栈的元素和栈中所有元素进行比较,最小的放在栈顶。这样是可以满足min函数的要求,但是这个数据结构就不是栈了,因为不能保证先进后出。那么我们考虑在栈中设置一个变量保存最小的元素,但是,加入我们将最小的元素出栈,那
2017-05-03 19:45:12 332
原创 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.这个题感觉更像是找规律,我的思想是先求出从外到内一共有多少圈,然后去输入每一圈的四条边。 求圈数,要根据矩阵短边的长度来确定,也就是如果矩阵
2017-05-03 16:00:21 498
原创 二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \
2017-05-02 14:05:56 360
原创 树的子结构—递归、Java
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)主要思路: (1)在tree1中寻找tree2的根节点,如果找到了,就接着往下匹配左右节点,如果没有找到,就直接返回false,表示匹配失败; (2)加入tree1的某个节点和tree2的根节点相等,但是左右子树并不相同,并不能说明tree2就不是tree1的子结构,应该继续往下寻找; 如上图所示,根节点
2017-05-02 09:24:33 722
原创 合并两个排序列表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。这个题,如果我们按照一般的思路去思考,不用递归的话,就是从两个链表的开头往后比较,数值小的放到新的链表中,然后又从链表的开头进行比较。 这样知道其中某一个链表的所有元素被遍历完,另一个没有被遍历完的链表的剩余部分一定是有序的,并且比新的链表的中的节点的值大,所以直接接在新的链表的后面即可。综上分析,代码如下
2017-04-28 11:24:47 3518
原创 iOS 使用AFNetworking传递复杂的POST参数(数组、键值对)
项目要进行一个购物车价格的计算,需要从客户端传递用户购物车中商品的信息,包括ID和数量,同时 涉及到优惠码。 一般我们用AFNetworking传递参数都是使用如下代码:// 取得管理者 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];// 取得连接 NSMutabl
2017-04-27 22:04:24 9215 1
原创 反转链表
输入一个链表,反转链表后,输出链表的所有元素。首先这个题要看清楚,是反转链表再进行输出,而不是将链表反向输出。所以第一件要做的就是将链表反转。假如首先我们只考虑两个节点的反转,只需要将head.next指向之前的节点就行了。但是假如有三个节点,加入第二个是当前的head的节点,我们将head.next指向之前的节点,前两个节点的顺序交换了,但是第三个节点和第二个节点就断了。所以,还要一个节点记录he
2017-04-27 21:23:22 434
原创 链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。链表采用非连续地址存储,所以节点中都会存储下一个节点的信息,有的链表还会同时存储上一个节点和下一个节点的信息。因此链表相比于数组来说,输出指定位置的元素并不那么容易。需要进行遍历操作,这是无法逃脱的。这个题,我们首先要考虑: (1)链表为空时,直接返回null; (2)k的值<1的时候,也不正确; (3)k的值超过链表长度也不正确。这时候,很简单的一种
2017-04-27 13:58:55 375
原创 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。这个题,有两种考虑方法,一种是空间换时间,一种是时间换空间。方法一: 空间换时间。思路是,遍历原数组,遇到是奇数的就加入到新的数组中,并且要设置一个标志位一直指向新数组中待插入的那一位。然后,再次遍历数组,遇到偶数就
2017-04-26 12:40:31 273
原创 数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。这道题是感觉比较难的一道题。 用库函数很简单,但是不在考虑范围之内。 首先分析 (1)当指数(exponent)<0,要考虑底数(base)是不是为0,例如0^-5=1/0^5,会出错。 (2)当指数(exponent)=0,最红的值为1; (3)当指数(exponent)>0,就
2017-04-25 21:56:46 282
原创 二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。首先要理解这个题考点不是要你怎么去表示原码、补码、反码之类的。在计算机中正数的表示就是他的原码,负数的表示就是他的补码。至于这几个码到底是怎么样的,后面再讲。举例子,6的二进制表示为0000 0110(一般都是用8位表示原码)。6-1,二进制的表示为:0000 0110 - 0000 0001,这个时候,遇到0000 0110从右到左,
2017-04-25 15:44:23 763
原创 矩形覆盖--递归实现
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?这个题的比较难以下手,首先找一下规律,n=1,只有一种,n=2,是一个正方形,可以讲小矩形横着放或者竖着放: 当n=3,假如第三个小矩形恰好能够竖直放下,这个时候,就相当于只考虑第一个和第二个小矩形怎么放,也就是怎么用小矩形去填充一个正方形,就回到了上一步,n=2时的方法
2017-04-25 14:53:14 855
原创 变态青蛙跳问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析:最后一个台阶是必须上的,而之前的每一个台阶都有两种选择,上或者不上,那么前n-1个台阶就有2的n-1次方中选择,这就是最终的答案,Java中实现2的n-1次方,要用到库函数math.pow(2,n)。加入不允许用库函数,就要用位移运算,而位移运算的效率还要更高。“<<” 左移:右边空出
2017-04-24 22:33:08 402
原创 青蛙跳台阶--尾递归优化
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 才开始感觉有点懵,就看一下规律,当台阶只有一级台阶,f(1)=1,当台阶有2级,f(2)=2,当台阶有3级,f(3) = 3,f(4) = 5,依次类推,发现是个斐波拉切数列。那么,为什么会是这样呢? 假设要跳到6,有两种,一种是从5跳到5,这个时候,跳到6的方式就是f(5),另一种是从4跳到6,方法数就
2017-04-24 13:19:15 677
原创 输出斐波那契数列的第n项
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39斐波拉切数列简单的说就是0,1,1,2,3,5,8……,简单的说就是后一项是前两项的和,很容易想到使用递归。既简单又方便,几行代码就搞定了。于是有了如下的代码:public class Solution { public int Fibonacci(int n) { if(n>39)
2017-04-24 10:18:40 4917
原创 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析这个题目,其实不用看什么数组的旋转的描述,感觉上没有多少意义,实际要做的就是对这个数组{3,4,5,1,2}进行操
2017-04-23 21:28:38 290
原创 点击选中cell后改变cell的样式
项目里有一个需求,选中的收货地址和其他的收货地址样式不同 选中之后,要动态的改变cell的样式,并在返回上一个控制器的时候更新显示, 上一个控制器需要更改的显示,如下图所示:之前想通过点击cell触发cell的-(void)layoutSubviews函数,进行子控件frame的改变,没被选中的cell,打钩的UIImageView的frame设置为0,被选中的设置为相应的正常尺寸,其他的控件的
2017-04-21 10:49:03 1502
原创 用两个栈实现队列
栈的特点是“先进后出”,队列的特点是“先进先出”。 再插入的时候,先将第一个元素压入栈的栈底,后面的元素依次压入栈顶,最后一个压入的元素在栈顶。 而出栈的时候,必须从栈顶开始出栈,也就是最先入栈的元素最后出栈。这时,我们将所有元素{1,2,3,4,5}压入栈1,从栈底到栈顶,依次是{1,2,3,4,5}。栈1的出栈顺序是{5,4,3,2,1}。每次,在栈1出栈一个元素后,就将元素压栈到栈2,这时
2017-04-21 10:23:05 294
原创 根据二叉树的前序遍历和中序遍历,重构二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。前序遍历的顺序是“根->左->右”,中序遍历的顺序是“左->根->右”。因此,前序遍历的第一个数就是二叉树的根节点,在中序遍历中,找到根节点,根节点的左边是二叉树的左
2017-04-20 11:04:51 561
原创 从链表翻转的递归算法到递归与栈的关系
早上起来做一个算法题,题目是从尾到头输出链表。 先遍历的后输出,与栈的先进后出特性一样,所以考虑用压栈出栈来解决。 先用非递归算法,比较简单,代码如下;public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { // 方法一:非递归,利用栈先进后出的特性 ArrayList <Integer>res
2017-04-19 09:45:58 509
原创 我对知乎上的如何面试一个iOS工程师帖子的一点回答
因为要找工作,在知乎上看了一个帖子,叫做“如何面试iOS工程师”,里面有一些初级问题,我记录下来,一是分享,而是记录,方便复习,如果有不对的,请批评指正,共同进步。问题如下: 1.什么是arc?(arc是为了解决什么问题诞生的?) 2. 请解释以下keywords的区别: assign vs weak, __block vs __weak 3. __block在arc和非arc下含义一
2017-03-27 20:13:09 1043
原创 OC __block
块对象可以包含其访问的自动变量的副本,但是这个变量是只读变量,当想要在多个块对象之间共享变量,有三种方法: (1)外部变量; (2)静态变量(static) (3)若是在函数内部需要共享变量,需要将变量用__block修饰注意:__block变量不能和static、auto、register同时指定。下面举例://// test.c// testClassCluster////
2016-11-16 10:57:54 755
原创 OC浅拷贝和深拷贝
只复制指针成为浅拷贝,复制具有新的内存空间的对象称为深拷贝。简单的说,浅拷贝是多个指针指向同一片内存,每一个指针对这片内存的操作,都会改变内存中的数据。深拷贝是将原来内存区域中的信息拷贝到一片新的内存中,每个指针指向一个独立的内存区域,只是这些内存中的数据(或者说对象)是完全一样的,某个内存中的改变并不会影响其他的内存。深拷贝和浅拷贝的本质指针指向的地址是否相同,地址相同,就是浅拷贝,地址不同就是
2016-11-14 10:52:25 458
原创 OC匿名对象
在代码中只关注协议和抽象类,而没有具体的类名的对象成为匿名对象。 关于匿名的对象的说明: (1)没有用指针指向匿名对象; (2)匿名对象的内存分配在堆上,而不再栈上; (3)匿名对象只能使用一次; (4)同一个类的匿名对象,每一次创建都是不一样的 (5)开发中应避免使用匿名对象 下面进行代码说明:#import "People.h"@interface People ()@proper
2016-11-13 15:04:08 450
原创 更新xcode8之后https连接问题
之前一直使用xcode6,这两天跟新了,遇到了很多和大家一样的问题。但是使用大家的方法去解决,却行不通。总结了一下解决https连网的解决办法。 (1)很多人都提出来的,大多数情况下可以解决,就是修改你的info.plist文件。<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.
2016-11-10 15:16:00 2365 1
原创 OC中的类簇
类簇就是具有相同接口,并提供相同功能的一组类的集合。 类簇包括两种类,一种是公共类(指的是仅公开接口的抽象类),二是具体类,这些具体类的接口,由公共类的接口抽象化。具体类不能被直接使用,他们一般是作为公共类的子类进行实现的(也称之为私有子类)实际上,在编码中,公共类和具体类使用方法是一样的。实现某个类的方法并不是一定的。类簇会挑选出某种情况下最好的类去实现。我们以NSString为例来说明:#im
2016-11-10 14:58:32 634
原创 OC的可变参数
OC中对数据库进行操作、输出日志的时候,常常要用到可变参数。在定义可变参数函数之前要 (1)引入头文件stdarg.h头文件; (2)用…来表示可变函数参数; (3)获取参数前需要定义一个va_list类型的变量,例如 va_list persons, (4)接下来我们就要取出可变参数:va_start(persons,可变参数前面的一个变量的变量名);......f = va(pe
2016-11-09 16:44:50 774
原创 OC中,成员变量和属性区别
在OC中,首先看一下成员变量和属性的声明成员变量的表示如下:#import <Foundation/Foundation.h>@interface animal : NSObject{ @public NSString *name; @public NSString *height;}@end这里的name 和 height 就称之为OC的成员变量。而属性的声明如下:#impo
2016-11-09 13:28:15 598
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人