常见笔试题(二)

6、用obj-c写一个冒泡排序

-(void)mySort:(NSMutableArray *)mutArray
{
id tmpObj = nil;
unsigned long flag = mutArray.count-1;//flag :最大脚标
while (flag > 0) {
int k = flag;
flag = 0;
for (int j = 0 ; j < k ; j++) {
int order = NSOrderedAscending;// 或 NSOrderedDescending
if ([[mutArray[j] description] compare:[mutArray[j+1] description]] == -order) {
tmpObj = mutArray[j];
mutArray[j] = mutArray[j+1];
mutArray[j+1] = tmpObj; 
flag = j;
} 
}
}
}

延伸:C语言的冒泡排序:
(1)冒泡法对一维数组中的元素进行排序
void sort(int arr[],int arr_len)
{

for(int i=0;i<arr_len-1;i++)//外层循环
{

for(int j=0;j<arr_len-1-i;j++)//借助j实现一趟的次数
{

if(arr[j]>arr[j+1])
{

int temp=0;
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;

}
}

}
}

(2)用指针数组给字符串排序
void sort_a(char * name[],int n)
{

char *temp;
for(int i=0;i<n-1;i++)
{

for(int j=0;j<n-1-i;j++)
{

if(strcmp(name[j], name[j+1])>0)

{
temp=name[j];
name[j]=name[j+1];
name[j+1]=temp;

}
}

}
}

(3)给字符串数组排序
void rang(char str[][20],int n)
{

for(int i=0;i<n-1;i++)
{

for(int j=0;j<n-1-i;j++)
{

int result=strcmp(str[j],str[j+1]);
if(result>=0)
{

char temp[20];
strcpy(temp, str[j]);
strcpy(str[j], str[j+1]);
strcpy(str[j+1], temp);

}
}

}
}

7、简述你对UIView、UIWindow和CALayer的理解

UIView:属于UIkit.framework框架,负责渲染矩形区域的内容,为矩形区域添加动画,响应区域的触摸事件,布局和管
理一个或多个子视图

UIWindow:属于UIKit.framework框架,是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手
动创建多个UIWindow,同时加到程序里面。

UIWindow在程序中主要起到三个作用:

1、作为容器,包含app所要显示的所有视图

2、传递触摸消息到程序中view和其他对

3、与UIViewController协同工作,方便完成设备方向旋转的支持

CAlayer:属于QuartzCore.framework,是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处
理用户事件。UIView和CALayer是相互依赖的,UIView依赖CALayer提供内容,CALayer依赖UIView一共容器显示
绘制内容。延伸:UIViewController:管理视图的几成熟,每个视图控制器都有一个自带的视图,并且负责这个视图相关的一切事务。方便
管理视图中的子视图,负责model与view的通信;检测设备旋转以及内存警告;是所有视图控制类的积累,定义了控制器
的基本功能。

UIResponder的那张图

8、写一个完整的代理,包括声明,实现
//创建
@protocol BeforeMarriedDelagate <NSObject>
@required

-(void)doCook:(NSString *)foodName;
-(void)doHomework;
@optional

-(void)driveCar;

-(void)makeMoney;
@end

//声明
@interface Boy : NSObject< BeforeMarriedDelagate>

-(void)doCook:(NSString *)foodName;
-(void)doHomework;
-(void)makeMoney;
//实现

@implementation Boy

-(void)doCook:(NSString *)foodName

{

NSLog(@"做饭:%@!",foodName);

}

-(void)doHomework

{

NSLog(@"今天洗衣服!");

}

-(void)makeMoney

{

NSLog(@"Coding!!");

}
@end
9、分析json、xml的区别?json、xml解析方式的底层是如何处理的?

区别:

(1)可读性方面:基本相同,xml的可读性比较好

(2)可扩展性方面:都具有很好的扩展性

(3)编码难度方面:相对而言:JSON的编码比较容易

(4)解码难度:json的解码难度基本为零,xml需要考虑子节点和父节点

(5)数据体积方面:json相对于xml来讲,数据体积小,传递的速度跟快些

(6)数据交互方面:json与JavaScript的交互更加方面,更容易解析处理,更好的数据交互

(7)数据描述方面:xml对数据描述性比较好

(8)传输速度方面:json的速度远远快于xml

JSON底层原理:遍历字符串中的字符,最终根据格式规定的特殊字符,比如{}号,[]号, : 号 等进行区分,{}号是一个字典
的开始,[]号是一个数组的开始, : 号是字典的键和值的分水岭,最终乃是将json数据转化为字典,字典中值可能是字典,数
组,或字符串而已。

XML底层原理: XML解析常用的解析方法有两种:DOM解析和SAX解析。DOM 采用建立树形结构的方式访问 XML 文档,而
SAX 采用的事件模型。 。DOM 解析把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。使用 DOM 解析器的时候需
要处理整个 XML 文档,所以对性能和内存的要求比较高。SAX在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag
的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决
定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。

延伸:SAX与DOM的区别:

1、SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且由于应用程序只是
在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不
必解析整个文档;它可以在某个条件得到 满足时停止解析。一般来说,SAX 还比它的替代者 DOM 快许多。另一方面,由
于应用程序没有以任何方式存储数据,使用 SAX 来更改数据或在数据流中往后移是不可能的。

2、DOM 以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数
据和结构作出更改。它还可以在任何时候在树中上下 导航,而不是像 SAX 那样是一次性的处理。DOM 使用起来也要简单
得多。另一方面,在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。此外,创建一
棵 DOM 树可能是一个缓慢的过程。

3、选择 DOM 还是选择 SAX,这取决于下面几个因素:
应用程序的目的:如果打算对数据作出更改并将它输出为 XML,那么在大多数情况下,DOM 是适当的选择。并不是说使
用 SAX 就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。
数据容量: 对于大型文件,SAX 是更好的选择。数据将如何使用:如果只有数据中的少量部分会被使用,那么使用 SAX
来将该部分数据提取到应用程序中可能更好。 另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么 SAX
也许不是恰当的选择。
对速度的需要:SAX 实现通常要比 DOM 实现更快。

SAX 和 DOM 不是相互排斥的,记住这点很重要。您可以使用 DOM 来创建 SAX 事件流,也可以使用 SAX 来创建
DOM 树。事实上,用于创建 DOM 树的大多数解析器实际上都使用 SAX 来完成这个任务!

10、ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?当程序接到内存警告时ViewController将会收到这个消息:didReceiveMemoryWarning
从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。
这个函数的默认实现是:检查controller是否可以安全地释放它的view,如果view可以被释放,那么这个函数释放view并

调用viewDidUnload。重载这个函数来释放controller中使用的其他内存。但要记得调用这个函数的super实现来允许父
类(一般是UIVIewController)释放view。
如果你的ViewController保存着view的子view的引用,那么,在早期的iOS版本中,你应该在这个函数中来释放这些引
用。而在iOS3.0或更高版本中,你应该在viewDidUnload中释放这些引用。

时间: 2024-12-19 05:43:55

常见笔试题(二)的相关文章

Java常见笔试题&lt;二&gt;

1.静态代码块.非静态代码块.构造函数的输出顺序 情况一:没有继承父类时 1 class HelloA { 2 3 public HelloA() { 4 System.out.println("I'm A class"); 5 } 6 7 static { 8 System.out.println("static A"); 9 } 10 11 { 12 System.out.println("A"); 13 } 14 15 public sta

web前端常见笔试题总结

一.常见javascript笔试题 1.  var a = 1; delete a; console.log( typeof a); //number 显示生命的全局变量不能被删除 如果是 a = 1;   delete a; console.log(typeof a) //undefined; 隐式声明的全局变量可以删除 2.用一行代码实现字符串翻转 如: str="abcdefg",翻转后str="gfedcba"; var a = str.split('').

某支付公司笔试题二

题目:用java编写一段程序采用选择排序法对数组array = {25,15,42,16,12,36}进行由小到大排序. 1.选择排序法 该排序法的思想是每次从当前元素开始往后查找最小元素,将最小与当前元素进行位置互换.选择排序和冒泡排序相比优势在于交换次数减少. // 时间复杂度n(n-1)/2,即O(n^2) public static void selectSort(int[] array){ int k,tmp,len; len=array.length; for(int i=0;i<l

C#常见笔试题

1.产生20个不同的两位整数的随机数,并且对它们进行由小到大的排序.特别提醒:程序要自动生成20个不同的整数,而且这些整数必须是两位的,如:3不是两位整数,58是两位整数 List<int> numbers= new List<int>(); Random rnd = new Random(); int i = 0; while (i < 20) { int s = rnd.Next(10, 100); //注意s的值大于等于10小于100 if (!numbers.Cont

js作用域之常见笔试题,运行结果题

笔试题中经常有运行结果题,而大多体型都是围绕作用域展开,下面总结了几种相关的题: 外层的变量函数内部可以找到,函数内部的变量(局部变量)外层找不到. function aaa() { var a = 10; } alert(a);//Error a is not defined 由于a是函数内部定义的局部变量,根据作用域关系,外层(全局环境)访问不到局部变量.因此会报错 var a=10; function aaa(){ alert(a); } function bbb(){ var a=20;

数据结构与算法常见笔试题

一.算法的基本概念计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法.1.算法的基本特征:可行性,确定性,有穷性,拥有足够的情报.2.算法的基本要素:算法中对数据的运算和操作.算法的控制结构.3.算法设计的基本方法:列举法.归纳法.递推.递归.减半递推技术.回溯法.4.算法设计的要求:正确性.可读性.健壮性.效率与低存储量需求二.算法的复杂度1.算法的时间复杂度:指执行算法所需要的计算工作量2.算法的空间复杂度:执行这个算法所需要的内存空间三.数据结构的定义1.数据的逻辑结构:反映数

java常见面试题——java常见笔试题

注:转载自http://www.cnblogs.com/yhason/archive/2012/05/08/2489932.html,版权归其所有! 5.String是最基本的数据类型吗? 基本数据类型包括byte.int.char.long.float.double.boolean和short. java.lang.String类是final类型的,因此不可以继承这个类.不能修改这个类.为了提高效率节省空间,我们应该用StringBuffer类 6.int 和 Integer 有什么区别 Ja

[转] C语言常见笔试题大全1

点击阅读原文 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365UL) [此处对原文有改动]我在这想看到几件事情:1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的.3). 意识到这个表达式将使一个16位机的整型数溢

常见笔试题(三)

11.面向对象的三大特征,并作简单的介绍. 面向对象的三个基本特征是:封装.继承.多态. 封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的 数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.隐藏对象的属性和实现细节,仅对外公开接口,提高代 码安全性,封转程度越高,独立性越强,使用越方便. 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过 继承创建的新类称为"子类&q