由于各种原因打算从现公司离职,于是就有了今天的面试分享,可能最近一段时间都会更新这个话题相关的文章。有兴趣的可以follow一下。
今天一共面试了两家,上午一家下午一家,上午十点我就到了第一家公司,填写了个人信息,个子高的离谱的人事妹纸就递过来一份面试题,我一看每个题都那么眼熟,而且都可以说个大概,但是写到纸上的文字就是组织不好,这也许是我们码农的通病吧!下面我分享下对于我来说比较困难的题(其实大部分题网上都有,大家面试之前多看下《招聘一个靠谱的iOS》不知道为啥,好多公司现在全都从这上面上找题,甚至直接就是复制粘贴过来的)。
- 1.最长公共子字符串查找(OC实现)
使用类别扩展NSString实现。
//实现查找两个字符串中最大相同的子串,例如:”likeyou”和”lookyou”,最大相同的子串是”you”。
#import <Foundation/Foundation.h>
#import "NSString+Find.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
char *s1=malloc(30*sizeof(char)),*s2=malloc(30*sizeof(char));
NSLog(@"输入字符串1(长度小于30):");
gets(s1);
NSLog(@"输入字符串2(长度小于30):");
gets(s2);
NSString *str1=[NSString stringWithUTF8String:s1];
NSString *str2=[NSString stringWithUTF8String:s2];
NSLog(@"你输入的两个字符串为:%@,%@",str1,str2);
NSString *subStr=[str1 findMaxSubstring:str1 andString2:str2];
if (subStr) {
NSLog(@"最长公共子串是:%@",subStr);
}
}
return 0;
}
- NSString+Find.h
#import <Foundation/Foundation.h>
@interface NSString (Find)
//找到两个字符串的最大公共子字符串
-(NSString*)findMaxSubstring:(NSString *)string1 andString2:(NSString*)string2;
@end
- NSString+Find.m
#import "NSString+Find.h"
@implementation NSString (Find)
-(NSString *)findMaxSubstring:(NSString *)string1 andString2:(NSString *)string2{
// 首先找到长度较小的字符串 保证string1<string2
NSString *temp;
if ([string1 length]>[string2 length]) {
temp=string1;
string1=string2;
string2=temp;
}
long length1=[string1 length];
// 然后从长到短获取string1的子字符串,去string2中找,如果包含,则返回该子字符串,否则再找
NSRange range=NSMakeRange(0, length1);
while (![string2 containsString:[string1 substringWithRange:range]]&&range.location<=length1-1&&range.length>=1) {//如果string2不包含目前的子串并且没有越界
// 判断下一步操作
if (range.location<length1-range.length) {//不需要减length
range.location++;
}else{
range.length--;
range.location=0;
}
}
// 最后判断并返回子串
if (range.length==0) {
NSLog(@"没有找到公共子字符串!");
return nil;
}else{
NSLog(@"找到了");
return [string1 substringWithRange:range];
}
}
@end
其实这是一道算法题,不使用类别也可以实现。
下面是我写的Demo
- 2.如何用GCD同步若干个异步任务?(如根据多个Url异步加载多张图片,然后在都下载完成后合成一张整图)
//使用Dispatch Group追加block到Global Group Queue,这些block如果全部执行完毕,
//就会执行Main Dispatch Queue中的结束处理的block
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{ /*加载图片1 */ });
dispatch_group_async(group, queue, ^{ /*加载图片2 */ });
dispatch_group_async(group, queue, ^{ /*加载图片3 */ });
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 合并图片
});
答题的时候只要打出group概念和完成结束后的notify就加分。
//面试的第二场也问了GCD相关的问题,看来有必要刚一波GCD了!
面试感想:现在的大公司基本上都是看学历和经历,这个是门槛,没有高一点的学历,基本还是那个不看你的简历的,而且即使你学历达标,也是要求你是大厂出来的,也就是阿里P8P10级别的。说实话,有点小受打击!
未完待续。。。