C/C++笔试题(5)

1、写一算法检测单向链表中是否存在环(whether there is a loop in a link list),

要求算法复杂度(Algorithm's complexityO(n)) 并只使用常数空间(space is O(c)).

注意,你只知道一个指向单向链表头的指针。链表的长度是不定的,而且环出现的地方也

是不定的,环有可能在头,有可能在中间。而且要求是检测, 不能破坏环的结构.MOTO

答:用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步;  p2 指针追上 p1的时候,就表明链表当中有环路了。

int testLinkRing(Link *head)
{
  Link *t1=head,*t2=head;
  while( t1->next && t2->next)
   {
       t1 = t1->;next;
            if (NULL == (t2 = t2->next->next))
               return 0;   //
无环

            if (t1 == t2)
               return 1;
     }
  return 0;
}

如果要定位环路在链表当中的开始点

发现p2p1重合,确定了单向链表有环路了。接下来,让p2回到链表的头部,重新走,P1也继续走,每次步长都走1,那么当p1p2再次相遇的时候,就是环路的入口了。

 

 

2、设下列函数已经通过了调试

bool Sort_Array(ArrayType * Pinputarray, ArrayType * Poutarray);

该函数在内存中排序,能把字节数最大为 100M 字节的ArrayType类型的数组排序。其中Arr

ayType是一个预定义的数组类型(细节无关紧要),PinputarrayPoutarray分别为排序前的指针和排序后的指针。

请用c语言的伪码风格设计一个算法,他调用上面给出的函数完成下列从输入到输出的任务

输入:排序前的大文件,名称为char * pinoutfilename ,其内容为用分号分隔的ArrayT

ype类型的数组元素,可装满4 100M 字节的数组。

输出:排序后的大文件char * poutoutfilename

 

3、用最有效率的方法算出2乘以8等於几?

移位

 

4、选择题

(1).错误的转义字符是 (a )

A.'/091' B.'//'

C.'/0' D.'/''

String s="/"";   //s="    charc='/''; //c='   /是转移字符

(2.)若数组名作实参而指针变量作形参,函数调用实参传给形参的是 ( )

A.数组的长度 B.数组第一个元素的值 C.数组所有元素的值 D.数组第一个元素的地址

 

(3).变量的指针含意是指变量的 ( )

A.  B.地址 C.存储  D.名字

 

(4)某文件中定义的静态全局变量(或称静态外部变量)其作用域是 ( )??

A.只限某个函数 B.本文件C.跨文件 D.不限制作用域

静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

 

5、(1) 解二次方程:a*x*x+b*x+c

int Quadratic( double a,double b,double c,double& x1,double& x2);

返回值:解的个数

 

(2.) 最大公约数

DWORD Divisor( DWORD dwFirst, DWORD dwSecond );

返回值:最大公约数

 

(3). 根据蒙特卡洛算法计算圆周率

double PI( DOWRD dwCount/*测试次数*/ )

返回值:PI

 

(4) 无符号整数乘法,乘数为32bit,结果为64bit

提示:32bit整数分解为16bit相乘

void Multiply( DWORD dwFirst, DWORD dwSecond, DWORD& dwHigh, DWORD& dwLower );

 

 

(5) 链表排序(从小到大)

节点定义为:

struct Node{

  int nValue;

  struct Node* pNext;

};

最后一个节点的pNext = NULL.

Node* SortChain( Node* pHead );

返回值:链表头

冒泡排序,插入排序等。为避免繁琐可以不交换指针,只交换值;也可以将值存入数组,对数组排序,再存入链表中。

 

6、改错并说明原因

file: 1.c

int a[10]={0};

file: 2.c

int main ()

{ extern int *a;

  printf ("%d/n", a[0]);

  return 0;

}

 

7、  #include “filename.h”#include <filename.h>的区别?

对于#include <filename.h>编译器从标准库开始搜索filename.h;对于#include “filename.h”编译器从用户工作路径开始搜索filename.h

 

8、 头文件的作用是什么?

一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。

二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

 

9、  C ++函数中值的传递方式有哪几种?

C++函数的三种传递方式为:值传递、指针传递和引用传递。

 

10、  内存的分配方式的分配方式有几种?

答:一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。

二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
三、从堆上分配,亦称动态内存分配。程序在运行的时候用mallocnew申请任意多少的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

 

11、  实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;

//删除操作
Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e)
{
  if(!(p=GetElemP_DuL(L,i))) //
此处得到i位置的节点指针,如果有需要也得写出具体函数实现
    return ERROR;
  e=p->data;
  p->prior->next=p->next;
  p->next->prior=p->pror;
  free(p);
  return OK;
}

//插入操作
Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e)
{
  if(!(p=GetElemP_DuL(L,i)))
    return ERROR;
  if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) //
生成新节点

    return ERROR;

  s->data=e;
  s->prior=p;
  p-> next -> prior =s;
 p->next=s;  

s->next=p->next->next;  
  return OK;
}

 

 

12、  写一个函数,将其中的/t都转换成4个空格。

 

13、  Windows程序的入口是哪里?写出Windows消息机制的流程.

 

14、  如何定义和实现一个类的成员函数为回调函数?

 

15、  C ++里面是不是所有的动作都是main()引起的?如果不是,请举例.

比如全局变量的初始化,就不是由main函数引起的

举例: class   A{};  
        A   a;   //a
的构造函数限执行
 
        int   main()
{}  

 

16、 C ++里面如何声明const void f(void)函数为C程序中的库函数(华为)

 

17、 下列哪两个是等同的

int b;

A const int* a = &b;

B const* int a = &b;

C const int* const a = &b;

D int const* const a = &b;

 

18、内联函数在编译时是否做参数类型检查

内联函数要做参数类型检查,   这是内联函数跟宏相比的优势

 

19、 三个float:a,b,c

问值 (a+b)+c==(b+a)+c   (a+b)+c==(a+c)+b

两者都不行。在比较floatdouble时,不能简单地比较。由于计算误差,相等的概率很低。应判断两数之差是否落在区间(-e,e)内。这个e应比浮点数的精度大一个数量级。  

 

20、把一个链表反向  填空   (lucent)

<<<<void reverse(test* head)
{
test* pe = head;
test* ps = head->next;
while(ps)
{
pe->next = ps->next;
ps->next = head;
head = ps;
ps = pe->next;
}
}

从第一个元素开始,ps指向他,将他(ps)指向头节点(ps->next = head),将ps设为头节点(head = ps;)操作下一个元素(ps = pe->next;)等于是依次将每个元素翻到原头节点前面。

 

21、 设计一个重采样系统,说明如何anti-alias

 

22、 某个程序在一个嵌入式系统( 200M CPU, 50M SDRAM)中已经最化了,换到另一个系统(

300M CPU, 50M SDRAM)中运行,还需要优化吗?

 

23、. 下面哪种排序法对12354最快

a quick sort

b.buble sort

c.merge sort

 

24、. 哪种结构,平均来讲,获取一个值最快

a. binary tree

b. hash table

c. stack

 

25、请问C++的类和C里面的struct有什么区别?

class中默认的成员访问权限是private的,而struct中则是public

 

26、 请讲一讲析构函数和虚函数的用法和作用?

析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。 有适放内存空间的做用。

虚函数是C++多态的一种表现, 使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。

 

27、 全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?

生命周期不同:全局变量随主程序创建和创建,随主程序销毁而销毁  

局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在; 内存中分配在全局数据区
使用方式不同:通过声明后全局变量程序的各个部分都可以用到  
                   
局部变量只能在局部使用;分配在栈区

操作系统和编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面

 

28、 一些寄存器的题目,主要是寻址和内存管理等一些知识。

 

29、 8086是多少位的系统?在数据总线上是怎么实现的?

 

30、多态。overload override的区别。

overload是重载,重载是一种参数多态机制,即代码通过参数的类型或个数不同而实现的多态机制。 是一种静态的绑定机制(在编译时已经知道具体执行的是哪个代码段)。  
 override
是覆盖。覆盖是一种动态绑定的多态机制。即在父类和子类中同名元素(如成员函数)有不同的实现代码。执行的是哪个代码是根据运行时实际情况而定的。

 

重载Overload特点

public bool withdraw(double amt, string name)

public double withdraw(double amt)

1、方法名必须相同2、参数列表必须不相同3、返回值类型可以不相同

注意:override存在于继继承的关系类中。

覆写Override特点(三相同)

public override bool withdraw(...)

1、方法名相同2、参数列表相同3、返回值类型相同

注意:存在于同一类中,但是只有虚方法和抽象方法才能被覆.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值