葵花宝典1.0
葵花宝典 欲练此功,必先自宫
若不自宫,也能成功
前言:
本秘籍只针对现场面试的学员,本教没有搜集到视频面试的资料,所以不做评论,姑且认为与现场面试大同小异。
强烈建议学员尽早提交入学测试(可百度可群里讨教),切不可慢慢悠悠看完视频再做,以免耽误时机,后期面试全被约满。提交测试后应预约较晚的时间面试,如10号是本批次录取,那学员可预约9号10号面试,给自己留下充足准备时间。
话不多说,少年,发功!
黑马面试分为3部分:(按顺序)
1》笔试:手写3道编程题。(据说视频只写一道) 2》自我介绍。
3》口答。
先说口答:
根据官方提供的口答知识点如下:
C语言:变量,函数,选择结构,循环结构,指针,结构体,枚举,宏定义
OC语言:面向对象,类与对象,方法,封装,继承,多态,self,super
设计模式:代理
特有语法:协议,分类,代码块(@protocol, Gategory, Block)
Foundation框架:NSString,NSArray,NSDictionary
根据众教徒的反馈,面试官实际问到的问题为: 介绍Foundation框架的结构体,手动管理内存,分类,协议,C预处理指令,Block,autorelease和release的区别,@property,单例设计模式,枚举,宏定义,self与super,代理,strong与weak,NSString的各种…
如有不全之处,绝对正常。
再说自我介绍:
如果你有故事,可以讲给面试官听,但是前提是,必须先把自己的基本情况讲清楚。讲的时候一定要看面试官脸色,如果发现她表情冷漠,应及时转移话题。可以说实话,但要有选择的说,每个面试官都希望招到性格开朗,学习认真刻苦,家
境殷实并全力支持你,你也超级热爱黑马热爱IOS的学员。这里不多累赘,大家自己发挥。
接下来是最重要的笔试部分:
以下是本教整理的笔试真题,多写,你的笔试题最少有一道就在这里面。具体答案这里只提供一部分,其余请百度或者群内交流。
1》 创建一个NSDictionary,并创建可变副本和
不可变副本,说下是深复制还是浅复制。 2》 有序数组,插入一个数后还保证有序。(OC) 3》 NSString和NSDictionary的遍历,知道几
种写几种。
4》 NSArray的遍历,知道几种写几种。
5》 利用分类实现以下两个功能:(1)字符串的
反转。(2)计算字符串中英文字母的个数 6》 求几个字符串的最大公共子字符串(oc)
7》 输入6个字符串,按首字符的大小,对6个
字符串排序。
8》 编写一个函数,找出整数数组的最小值。 9》 编写一个程序,用于接收从终端输入的整数,
提取并用英文显示这个数的每一位数,例如输入112,输出One One Two
10》 求两个字符串的公共字母,添加到第三个
字符串中。
11》 给一个英文句子,把每个单词的首字母转
成大写。
12》 给一个英文句子,罗列出句子中出现的字
母和其出现的次数,不区分大小写。
4》NSArray遍历的四种方法
第一种,for循环
void arrayFor()
{
//快速创建一个oc数组
NSArray *array = @[@”one”,@”two”]; //遍历数组
for(int i=0; i
{
NSLog(@”array[%i]=%@”,i ,array[i]); }
}
第二种,快速遍历for(if obj in array) void arrayFor()
NSArray *array = @[@”one”,@”two”]; for(id obj in array)
{
NSLog(@”%@”,obj);
}
}
第三种 调用block,原理:每遍历一个元素,就会调用一次block,并且把这个元素和下标当做block的参数传给id obj和idx
void arrayFor()
{
NSArray *array = @[@”one”,@”two”];
[array enumerateObjectsUsingBlock:^(id obj, NSInteger idx, BOOL *stop)
{NSLog(@”array[%zi]=%@”,idx,obj);
if(idx==1)
{*stop=YES;}
}];
第四种 通过迭代器遍历数组
void arrayFor()
{
NSArray *array = @[@”one”,@”two”]; //获取数组的迭代器
NSEnumerator *enumerator = [array objectEnumerator];
id obj = nil;
//获取下一个数组元素,当下一个元素不为空的时候,继续遍历直到下个元素为空
while((obj =[enumerator nextObject])!=nil) {
NSLog(@”%@”,obj);
3>NSDictionary的遍历
第一种 for循环快速遍历
void dictFor()
{
NSDictionary*dict=@{@”k1”:@”v1”,@”k2”:@”v2”};
//遍历字典的所有key
for(id key in dict)
{
id value=[dict objectForKey:key];
NSLog(@”%@=%@”,key,value);
}
第二种 使用迭代器遍历
void dictFor()
NSDictionary*dict=@{@”k1”:@”v1”,@”k2”:@”v2”};
NSEnumerator *enumer=[dict keyEnumerator]; id key =nil;
while(key=[enumer nextObject])
{
id value=[dict objectForKey:key];
NSLog(@”%@=%@”,key ,value);
}
第三种 使用block遍历字典
void dictFor()
{
NSDictionary*dict=@{@”k1”:@”v1”,@”k2”:@”v
2”};
[dict
enumeratorKeysAndObjectsUsingBlock:^(id key ,id obj ,BOOL *stop)
{NSLog(@”%@=%@”,key ,obj);}
];
5>利用分类实现两个方法
第一个:计算某个字符串中英文字母的个数 #import “NSString + Number.h”
@implementation NSString (Number)
-(int)numberCount
{
int count =0;
for(int i=0; i
{
//取出i这个位置对应的字符
unichar c=[self characteAtIndex:i];
if((c>=’a’&&c=’A’&&c
{ count++;
}
return count;
}
第二个:实现字符串的反转
@implementation NSString (Reverse)
-(NSString *)reverseOfString
{
//定义一个可变字符串
NSMutableString *str = [NSMutableString string];
//按倒序遍历字符串
for(int i=(int)self.length-1; i>=0; i--)
{ //按倒序获取每个字符串的range
NSRange range =NSMakeRange( i,1);
//将每个字符按照它的range截取下来,并保存在不可变字符串s中
NSString *s = [self substringWithRange: range];
//将每个单字符的字符串s拼接到可变字符串str中
[str appendString: s];
}return str;
}
7》多个字符串排序:char *name[]={“china”,”america”,”australia”};
#include
#include
void sort_string(char *name[], int len)
{
int min;
for(int i=0; i
{
min =i ; //假设一个最小值
for(int j=i+1; j
{
//比较大小
if(strcmp(name[j],name[min])
{
min=j;
}
}
//交换(地址交换)
if(i!=min)
char *temp;
temp = name[i];
name[i]=name[min];
name[min]=temp;
}
}
8>编写一个函数,找出整数数组的最小值 int findMin(int *a,int n) //n为个数
{
int i,min=a[0];
for(i=0;i
{
if(min>a[i])
{
min=a[i];
return min;
}
9>编写一个程序,用于接收从终端输入的整数,提取并用英文显示这个数的每一位数,例如输入112,输出one one two
//定义一个变量初始化为0,用于保存用户输入的整数
int input =0;
//提示用户输入一个整数
NSLog(@”请输入一个整数”);
//接收用户输入的整数,并保存在input中 scanf(“%d”,&input);
//将用户输入的整数转换成字符串对象,并保存于inStr中
NSString*inStr=[NSString
stringWithFormat:@”%i”,input]
//设置一个不可变的英文数组
NSArray *engArray=@[@”Zero”,@”Two”…]; //设置一个可变的字符串用于存放处理的结果 NSMutableString
*engOutArray=[NSMutableString string]; //开始遍历
for(int i=0;i
{
//取出字符串对象中得每一个字符,并转换成整型数据
int dex=((int)[inStr characterAtIndex:i])-48; //根据整型数据,从英文数组中取出对应的英文单词,并存放于可变字符串中
[engOutArray appendString: engArray[dex]]; //存放英文单词后,加入一个空格
[engOutArray appendString:@“ ”];
}
//遍历结束,输出结果
NSLog(@”处理结果为:%@”,engOutArray); 10>
#include
#include
//定义一个函数,功能是获取两个字符串的最大公共子字符串 //形参分别为字符型指针变量str1、str2和整型常量 num1、num2
int getMaxSonStr(char *s1, char *s2, int len1, int len2) {
//index表示出现第一个相同字符时str1中对应字符的下标
int index = 0;
//m 表示公共子串初始长度是0, n表示每个公共子串的长度
int m = 0, n = 0;
//遍历s1
for (int i = 0; i
{
//遍历s2
for (int j = 0; j
{
//遇到相同字符时
//s1[i] != '\0'可以防止越界
if (s1[i] ==s2[j] && s1[i] != '\0')
{
//子串长度为1
m = 1;
//s1[i+k]!='\0',结束符相等不比较,预防越界
for (int k = 0; s1[i+k] == s2[j+k] && s1[i+k]!='\0'; k++) {
//没多一个相同字符,子串长度自增+1
m++;
}
//假定n为最长的子串的长度
if(m > n)
{
//记录最长子串的起始下标
index = i;
//将最长子串的长度值赋值给最大公共子串长度
n = m;
}
}
}
}
//当存在子串时候,输出最大的
if(m !=0)
{
printf("最长的公共子串:");
for(int i = 0; i
{
printf("%c",s1[index+i]);
}
}
//不存在子串输出没有
else
printf("没有公共子串!\n");
return 0;
}
int main(int argc, const char * agv[])
{
//定义两个字符串str1和str2,并对其进行初始化
char str1[110];
char str2[110];
//提示用户输入第一个字符串
printf("请输入第一个字符串:\n");
//接收用户输入的字符串
gets(str1);
//提示用户输入第二个字符串
printf("请输入第二个字符串:\n");
//接收用户输入的字符串
gets(str2);
//计算输入字符串str1的长度
int len_str1 = strlen("str1");
//计算输入字符串str2的长度
int len_str2 = strlen("str2");
//调用函数,获取两个字符串的最大公共子字符串
}
printf("\n"); return 0; getMaxSonStr(str1,str2,len_str1,len_str2);