一、算法类
1、1!+3!+5!+······+(2N-1)!的和,N>5。
方法a: 两层的for循环(面试官说不对,但是我觉得可以实现)
long fun(int n){
long sum = 0;
for(int i = 1;i < N;i = i + 2){
long pro = 1;
for(int j = 1; j < i + 1; j++){
pro = pro * j;
}
sum = sum + pro;
}
return sum;
}//没有编译,不知道对不对啊!
方法b:网上搜了一下,可以用递归,但是貌似递归的效率并没有for循环高
long fuction1(int n){
if(n == 1){
return 1;
}else{
return n*fuction1(n-1);
}
}
long fun(int n){
long sum = 0;
for(int i = 1;i < N;i = i + 2){
sum = sum + fuction1(i);
}
return sum;
}<span style="font-family: Arial, Helvetica, sans-serif;">//没有编译,不知道对不对啊! 只提供思路</span>
2、比较简单,就是斐波那契数列,网上有的是。
int fib(int n)
{ if((n==1)||(n==2))
return 1;
return fib(n-1)+fib(n-2);
}
3、这个面试题没有,在面聊的时候问的,如下
有一列没有顺序的数列,存在一个数K,在该数列中找到数X,数Y,有等式K=X+Y成立,怎么找到这两个数最快。
首先将数列排序,然后另数列的第一个数(比如是最小的)为X,最后一个数(最大的)为Y,计算X+Y,
if(X+Y > K)
将最后第二个数赋值给Y
else if(X+Y < K)
将第二个数赋值给X
else
输出X,Y
二、Objective-C语法类
1、类别与扩展
类别(Category)在iOS开发中使用非常频繁,尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性。
类别主要有3个作用:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
@interface NSObject (CategoryName)
- (void)myMethod;
@end
<pre name="code" class="objc">@implemenation NSObject(CategoryName)
-(void)myMethod{
NSLog(@"this is Category");
}
@end
这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个myMethod方法。
使用Category需要注意的点:
(1) Category的方法不一定非要在@implementation中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃。
(2) Category理论上不能添加变量,但是可以使用@ dynamic(3)类别的方法中,不可以调用super方法
(4)category 方法可能会覆盖于同一个类class 的其它 category 中的方法。但也可能被覆盖,因为不法预知他们的加载优先顺序,出现这种情况通常会在编译时出错。如果在一个开发的SDK中使用了类别, 就最好保证类别名不同于使用者的类别名, 以及类别方法也不同于使用者的类别方法名, 通常通过加前缀来做到。
(该部分转自:传送门 多谢原作者的分享)
类别的局限性:
(1)无法添加新的实例变量(刚才有说,理论上不行)
(2)名称冲突,如果类别和现有的方法重名,类别具有更高的优先级,解决办法,类别方法名中添加一个前缀
(更加详细的文章点击传送门)
扩展:某些情况下,我们需要声明一个@property,它对外是只读的(readonly),而对内是可读写的(readwrite),这时,可以通过Extensions实现
// .h @interface BaseClass : NSObject @property (readonly) NSString *privateString; // 该.h文件对外公开 @end // .m @interface BaseClass() // 该.m文件对外是不公开的, 当然这里也可以放在专门的一个.h文件中,但同样不把这个文件进行公开。 @property (readwrite) NSString *privateString; @end @implementation BaseClass @synthesize privateString; //... @end
扩展还可以添加新的实例变量
@interface MyClass : NSObject
- (float)value;
@end
@interface MyClass () { //注意此处:扩展
float value;
}
- (void)setValue:(float)newValue;
@end
@implementation MyClass
- (float)value {
return value;
}
- (void)setValue:(float)newValue {
value = newValue;
}
@end
2、委托、非正式协议、正式协议
这篇文章写的很详细了,传送门
3、对id的理解
typedef struct objc_object {
Class isa;
} *id;
作用:
用于描述delegate的类型,比如对于tableView来说其只知道自己的delegate是继承自UITableViewController的对象,但并不关心delegate具体的类型,只需要知道delegate是不是实现了那几个协议required方法就行了,这时候无法也没必要让tableView知道delegate的具体类型。
容器类的遍历,对于Array来说似乎也不用关心自己包含哪些类型的对象,因此枚举迭代只需要知道有对象就可以了,至于枚举这些对象用来干什么那是程序员自己的事情,比如:
-
[array enumeratorObjectsUsingBlock: ^(id obj, NSUInteger index, BOOL *stop){ // do sth *stop = YES; }];
NSOperation
GCD(全称:Grand Central Dispatch)