面试题

一叶障目
不见泰山

记一次面试过程遇到的东西吧,总结一下

笔试题

###题1

int a[5]={1,2,3,4,5};int p=(int )(&a+1);问(a+1),(p-1)是多少

答:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
*(a+1)就是a[1],*(p-1)就是a[4],执行结果是25
&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5int
int *p=(int *)(&a+1);
则p实际是&(a[5]),也就是a+5
原因如下:
&a是数组指针,其类型为 int (*)[5];
而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。
a是长度为5int数组指针,所以要加 5*sizeof(int)
所以p实际是a[5]
但是p与(&a+1)类型是不一样的(这点很重要)
所以p-1只会减去sizeof(int*)
a,&a的地址是一样的,但意思不一样
a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,
a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].

题2

frame和bounds有什么不同,size是否会不同?

题3

readwrite,readonly,assign,retain,copy,nonatomic 属性的作用


1
2
3
4
5
6
7
8
9
@property是一个属性访问声明,扩号内支持以下几个属性:
1,getter=getterName,setter=setterName,设置setter与 getter的方法名
2,readwrite,readonly,设置可供访问级别
2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再 Copy出新的对象,retainCount为1
这是为了减少对上下文的依赖而引入的机制。
5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法
都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。

题4

求2-100之间的素数(质数)和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int num;
int i;
int sum;

for (num = 2; num<=100; num++) {

for (i=2; i<=num; i++) {
//遇到能相除余为0的就跳出循环,然后当前num 和 当前除数相比,除数最大的那一时刻的num值
if (num%i==0) {
break;
}
}
//也即是本事是自己最大的能相除的数
if (i>=num) {
sum+=num;
printf("素数 %d",num);
}

}

printf("总和为 %d",sum);

逻辑题

逻辑题1

1
一层楼,有10级台阶,可以一步、二步或三步走,有几种走法?
具体地说

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
逐次累加法
到第一层:1
到第二层:2
到第三层:4种,分别为
1 1 1
1 2
2 1
3
到第四层 7种.计算过程为:
到第一层的方法数 + 到第二层方法数 + 到第三层方法数.分别为
1 -- 3
1 1 -- 2
2 -- 2
1 1 1 -- 1
1 2 -- 1
2 1 -- 1
3 -- 1
到第五层方法数:13
计算过程为:到第二层的方法数 + 到第三层方法数 + 到第四层方法数.
具体为
1 1 -- 3
2 -- 3
1 1 1 -- 2
1 2 -- 2
2 1 -- 2
3 -- 2
1 3 -- 1
1 1 2 -- 1
2 2 -- 1
1 1 1 1 -- 1
1 2 1 -- 1
2 1 1 -- 1
3 1 -- 1
余此类推:
到第六层 = 到第三层+到第四层+到第五层 = 4+7+13 = 24
到第七层 = 到第四层+到第五层+到第六层 = 7+13+24 = 44
到第八层 = 到第五层+到第六层+到第七层 = 13+24+44 = 81
到第九层 = 到第六层+到第七层+到第八层 = 24+44+81 = 149
到第十层 = 到第七层+到第八层+到第九层 = 44+81+149 = 274
---------------------------
说明:在这种思路中,比如计算到达第九层的方法数时候,到第6层后要直接迈3步到达第9层,到第7层后要直接迈2步到达第9层.不考虑从第6层开始迈1步或2步的情况,以免重复计算.

逻辑题2

1
甲、乙、丙三人讨论一道题,当每一个人都把自己的解法说出后,甲说:“我做错了。”乙说:“甲做对了。”丙说:“我做错了。”老师看过他们的答案,并听了他们的上述意见后,说三个人中有一个答案正确,有一个意见正确。 ? ?由此可知,谁的意见正确

1
三个人的意见只有一人正确,首先可以看出甲和乙的意见矛盾,必有一真一假,据此推出丙的意见必然为假,即丙没做错,丙的答案是对的。三人中只有一人答案正确,据此可以推出甲说真话(甲的意见正确)

逻辑题3

1
12个相同小球里面有一个重量不一样3次找出来

1
2


热评文章