1、写一算法检测单向链表中是否存在环(whether there is a loop in a link list),
要求算法复杂度(Algorithm's complexity是O(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;
}
如果要定位环路在链表当中的开始点
发现p2和p1重合,确定了单向链表有环路了。接下来,让p2回到链表的头部,重新走,P1也继续走,每次步长都走1,那么当p1和p2再次相遇的时候,就是环路的入口了。
2、设下列函数已经通过了调试
bool Sort_Array(ArrayType * Pinputarray, ArrayType * Poutarray);
该函数在内存中排序,能把字节数最大为 100M 字节的ArrayType类型的数组排序。其中Arr
ayType是一个预定义的数组类型(细节无关紧要),Pinputarray,Poutarray分别为排序前的指针和排序后的指针。
请用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.)若数组名作实参而指针变量作形参,函数调用实参传给形参的是 (d )
A.数组的长度 B.数组第一个元素的值 C.数组所有元素的值 D.数组第一个元素的地址
(3).变量的指针含意是指变量的 (b )
A.值 B.地址 C.存储 D.名字
(4)某文件中定义的静态全局变量(或称静态外部变量)其作用域是 (d )??
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、 内存的分配方式的分配方式有几种?
答:一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。
二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
三、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
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
两者都不行。在比较float或double时,不能简单地比较。由于计算误差,相等的概率很低。应判断两数之差是否落在区间(-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、返回值类型相同
注意:存在于同一类中,但是只有虚方法和抽象方法才能被覆写.