笔试面试学习之路(二)

来源:互联网 发布:树莓派ubuntu系统 编辑:程序博客网 时间:2024/05/19 10:14

第二次:

6.下面程序的输出结果为多少(32位机器上)

1

2

3

4

5

6

7

8

9

10

11

12

void Func(char str_arg[2])

{

    int m = sizeof(str_arg);

    int n = strlen(str_arg);

    printf("%d\n", m);

    printf("%d\n", n);

}

int main(void)

{

    char str[] = "Hello";

    Func(str);

}



A.        5 5

B.      5 4

C.      4 5

D.      4 4

 

也可以写成

voidFunc(char *str_arg)

 

之所以能这样写,是因为Func的参数是一个地址

 

2,对于sizeof的参数,是一个指针,因为这是32位系统, 32 = 8*4,需要4字节存储指针。

如果是64位系统  64 = 8*8,需要8字节

 

3,对于strlen,就是字符串的长度,"Hello"长度是5strlen计算不包含\0的字符串的长度。

 

7.二进制值0.00110011001100110011001100110011转换成10进制后最接近____

在计算机中二进制转换为十进制是为:对应为乘以权值,小数点后面一次为2-1次方,上的-2次方依次类推。所以本题小数点后第一个1转换为十进制为2-3次方,第二个一为2-4次方,这两个的和为0.1875.估算这串二进制转换为十进制为0.2左右。

 

 

 

1.大整数845678992357836701转化成16进制表示,最后两位字符是?

正确答案: D   你的答案:B (错误)

AB

EF

8B

9D

我来给你们解答:先把此数搞成二进制的(当然不用全算。。。。),它要16进制最后两位,也就是二进制最后八位。那么最后八位怎么求?很简单,除二取余。这样从后往前写就是10111001。。。。二进制嘛,倒着写,最后两位位应该是10011101.化成16进制,就是9D喽。。。。。

 

2.用二进制来编码字符串“xyzwxyxx”,需要能够根据编码解码回原来的字符串,则我们最少需要多长的二进制字符串

正确答案: B   你的答案: D (错误)

12

14

15

18

24

哈夫曼编码的问题 x出现4 y2 w1 z1
x
0
y
10
w
110 
z
111
w
z的编码方案可以互换
length=1*4+2*2+1*3+1*3=14

 

3.

以下集合对象中哪几个是线程安全的?( )

正确答案: B C D   你的答案:A D (错误)

ArrayList

Vector

Hashtable

Stack

BCD  

在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的。在jdk1.2之后,就出现许许多多非线程安全的类。下面是这些线程安全的同步的类:

vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。

statck:堆栈类,先进后出

hashtable:就比hashmap多了个线程安全

enumeration:枚举,相当于迭代器

除了这些之外,其他的都是非线程安全的类和接口。

4.

关于do循环体while(条件表达式),以下叙述中正确的是?

 

正确答案: D  你的答案: C (错误)

条件表达式的执行次数总是比循环体的执行次数多一次
循环体的执行次数总是比条件表达式执行次数多一次
条件表达式的执行次数与循环体的执行次数一样
条件表达式的执行次数与循环体的执行次数无关

可能一次都没执行条件,可能执行相同的次数

do{

   if()

   break;

//  continue;

}while();

5.

下面有关servletinit,service,destroy方法描述错误的是?

正确答案: D   你的答案: B (错误)

init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法

Service()方法处理客户机发出的所有请求

destroy()方法标志servlet生命周期的结束

servlet在多线程下使用了同步机制,因此,在并发编程下servlet是线程安全的

答案为D

servlet在多线程下其本身并不是线程安全的。

如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。

init方法:是在servlet实例创建时调用的方法,用于创建或打开任何与servlet相的资源和初始servlet的状态,Servlet规范保证调用init方法前不会处理任何请求 

 service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用,根据HTTP请求方法(GETPOST等),将请求分发到doGetdoPost等方法 

destory方法:是在servlet实例被销毁时由web容器调用。Servlet规范确保在destroy方法调用之前所有请求的处理均完成,需要覆盖destroy方法的情况:释放任何在init方法中打开的与servlet相关的资源存储servlet的状态

6.

下面有关JAVA异常类的描述,说法错误的是?

正确答案: D   你的答案: C (错误)

异常的继承结构:基类为ThrowableErrorException继承ThrowableRuntimeExceptionIOException等继承Exception

RuntimeException一般是外部错误,其必须被 try{}catch语句块所捕获

Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形,Error不需要捕捉

RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等,必须被 try{}catch语句块所捕获

 

异常是指程序运行时(非编译)所发生的非正常情况或错误,当程序违反了语音规则,jvm就会将出现的错误表示一个异常抛出。

异常也是java的对象,定义了基类 javalangthrowable作为异常父类。这些异常类又包括errorexception。两大类

error类异常主要是运行时逻辑错误导致,一个正确程序中是不应该出现error的。当出现error一般jvm会终止。

exception表示可恢复异常,包括检查异常和运行时异常。检查异常是最常见异常比如 io异常sql异常,都发生在编译阶段。这类通过trycatch捕捉

而运行时异常,编译器没有强制对其进行捕捉和处理。一般都会把异常向上抛出,直到遇到处理代码位置,若没有处理块就会抛到最上层,多线程用threadrun()抛出,单线程用main()抛出。常见的运行异常包括空指针异常类型转换异常数组月结异常数组存储异常缓冲区溢出异常算术异常等,

 

7.jdk1.5的环境下,有如下4条语句:

1

2

3

4

Integer i01 = 59;

int i02 = 59;

Integer i03 =Integer.valueOf(59);

Integer i04 = new Integer(59)。

以下输出结果为false的是:

正确答案: C   你的答案: A (错误)

System.out.println(i01== i02);

System.out.println(i01== i03);

System.out.println(i03== i04);

System.out.println(i02== i04);

答案:C

JVM中一个字节以下的整型数据会在JVM启动的时候加载进内存,除非用new Integer()显式的创建对象,否则都是同一个对象

所有只有i04是一个新对象,其他都是同一个对象。所有AB选项为true

C选项i03i04是两个不同的对象,返回false

D选项i02是基本数据类型,比较的时候比较的是数值,返回true

8.Android系统对下列哪些对象提供了资源池

正确答案: A C   你的答案: A C D (错误)

Message

Thread

AsyncTask

Looper

A.Message提供了消息池,有静态方法Obtain从消息池中取对象;

B.Thread默认不提供资源池,除非使用线程池ThreadPool管理;

C.AsynTask是线程池改造的,池里 默认提供(核数+1)个线程进行并发操作,最大支持(核数  * 2 + 1)个线程,超过后会丢弃其他任务;

D.Looper,每个Looper创建时创建一个消息队列和线程对象,也不是资源池;

因此答案为AC

9.

在Java语言中,下列关于字符集编码(Character setencoding)和国际化(i18n)的问题,哪些是正确的?

正确答案: C D   你的答案:A C D (错误)

每个中文字符占用2个字节,每个英文字符占用1个字节

假设数据库中的字符是以GBK编码的,那么显示数据库数据的网页也必须是GBK编码的。

Javachar类型,以下UTF-16 Big Endian的方式保存一个字符。

实现国际化应用常用的手段是利用ResourceBundle

A 显然是错误的,Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节。

B 也是不正确的,不同的编码之间是可以转换的,通常流程如下:

将字符串S以其自身编码方式分解为字节数组,再将字节数组以你想要输出的编码方式重新编码为字符串。

例:String newUTF8Str = new String(oldGBKStr.getBytes("GBK"), "UTF8");

C 是正确的。Java虚拟机中通常使用UTF-16的方式保存一个字符

D 也是正确的。ResourceBundle能够依据Local的不同,选择性的读取与Local对应后缀的properties文件,以达到国际化的目的。

 

综上所述,答案是  C D

10.

下面哪几种是 STL容器类型()

正确答案: A B D E   你的答案: A C (错误)

vector

set

multivector

multiset

array

11.

从n个数里面找最大的两个数理论最少需要比较

正确答案: C   你的答案: B (错误)

2logn

2 logn -1

n+ logn -2

2n-3

类似比赛晋级,两两配对比较,赢的再两两配对,最后得到冠军(最大的数),可以看成是一棵二叉树,以4人为例:

                           0

                     0          2

                  0    1    2     3

可以看出,找出最大的数比较次数是n-1。然后第二大的数肯定是跟冠军比较过的数字,那么很明显每一层都有一个,所以有logn-1次比较。

 

所以总共是n+logn-2次比较

12.

国标规定接入网的维护管理接口应符合()接口标准

正确答案: C   你的答案: B (错误)

Z

DTE/DCE

Q3

2B1Q

13.

排序算法中的比较次数与初始元素序列的排列无关()

正确答案: B   你的答案: A (错误)

B

 

比如冒泡排序,因为一般在实现冒泡排序时,都采用改进算法,设置一个标志位flag,将其初始值设置为非0,表示被排序的表示是一个无序的表,每一次排序开始前设置flag值为0,在进行数据交换时,修改flag为非0。在新一轮排序开始时,检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序;否则进行排序。所以,当记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序即可

比较次数与初始元素顺序无关的排序算法(即最好、最坏情况的时间复杂度一样)

选择排序O(n^2)

堆排序O(nlogn)

归并排序O(nlogn)

基数排序O(tn)

14.

一棵左子树为空的二叉树在前序线索化后,其中空的链域的个数是()

正确答案: D   你的答案: A (错误)

不确定

0

1

2

一棵左子树为空的二叉树,形态为右单支树,这样前序序列为根、右根... 
因为根结点在前序序列第一个,没有前序的前驱,这样根结点的左指针链域就是空的 
最下边的叶子(也就是最右边结点)是前序序列最后一个,没有前序的后继,因此该结点的右指针链域也是空的 
因此,空的链域合计2

15.

一次I/O操作的结束,有可能导致()

正确答案: A   你的答案: B (错误)

一个进程由睡眠变就绪

几个进程由睡眠变就绪

一个进程由睡眠变运行

几个进程由睡眠变运行

进程状态有三个,等待(阻塞),就绪,运行。等待状态是等待时间的发生,比如输入的指令,如果i/o操作结束,则表示某个进程进行的可能的输入输出,这可能会是某一个进程的事件触发,从而导致该进程有等待转到就绪,然后等待cpu分配的时间片到来,如果时间片到来则进入运行态。

 有睡眠不能直接进入运行,因为需要先转换到就绪状态。

16.

SQL语言允许使用通配符进行字符串匹配的操作,其中‘%’可以表示

正确答案: D   你的答案: B (错误)

零个字符

1个字符

多个字符

以上都可以

0 0