【820复试】综合面试之算法及编程语言篇

本文用于作者复试复习,若有错误,还望指出

1.分支定界和回溯法的区别?

求解的目标不同:

分支定界是找出满足约束条件的一个解或者说在约束条件下找到某种意义上的最优解。

回溯法是找出满足约束条件的所有解。

搜索方式不同:

分支定界以广度优先或最小耗费成本优先搜索。

回溯法是以深度优先搜索。

2.给一个单链表,把单链表循环右移若干个位置

记链表长度为n,右移k个位置。计算移动次数m=k%n。然后将链表后m个元素用头插法插入到表头即可。

3.说明一下大O记号

大O记号是用某个函数来描述一个函数数量级的渐近上界。通常是用来可化渐进行为的数学符号。在计算机科学中,在分析算法的时空复杂度方面非常有用。

4.n个数(n为偶数),比较次数不超过(3/2)n-2。找出最大和最小的数

第一遍循环:遍历数组,移动步数为i=i+2;第一个和第二个元素比较,第三个和第四个元素比较,…,比较结果大的放在前面,小的放在后面。这样的话,最大的数一定在位序为奇数的位置,最小的数一定在位序为偶数的位置。

第一遍循环的比较次数为n/2次。

第二遍循环:利用冒泡排序的思想,对奇数位置和偶数位置进行一次冒泡排序,比较次数都为n/2-1。

其中奇数位置进行升序冒泡排序,偶数位置进行降序冒泡排序。

从而,最大的数一定在数组的倒数第二个位置,最小的数一定在数组的最后一个位置。

最后累加比较次数和为:(3/2)n-2次。

5.贪心算法和动态规划的区别?

贪心算法并不从整体最优上加以考虑,所做的选择只是从某种意义上的局部最优解。

典型算法:dijkstra单源最短路径

动态规划是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。
如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。

典型算法:fib斐波那契数列。

6.prim算法生成最小生成树的过程,为什么是最小生成树

假设图G有n个结点,普利姆算法的做法是初始化一个空集S作为结点集和边权和ans为0,进行n次循环,每一次循环都从未被加入到S的结点选取一个到S距离最小的结点u加入到集合S中,并将u到S的距离累加到ans上。

若某一次循环中未找到这样的结点u,说明该图为非连通图。

否则,循环结束后,ans记录的就是最小生成树的边权之和。

7.说明一下如何实现电文加密

电文加密就是通过字符的ASCII码进行统一的转换,而通过ASCII码可以判断某字符为大写/小写字母,若为小写字母,转换方式就是 int ans = ‘a’+‘z’-x; x为该字符,ans为转换后字符的ASCII码。用%c即可输出字符。

8.什么是抽象数据类型

抽象数据类型就是通过数据对象、数据关系及其基本操作来定义的的。

典型的抽象数据类型:

栈、队列、双端队列、优先级队列、树、二叉树、堆、图、映射(map)、哈希表、桶、集合。

9.数组和结构体的区别

数组是相同类型元素的集合,而结构体可以是不同类型元素的集合。

数组的数组名就代表了首地址,可以依次+1,+2,就可以表示其他元素的地址;

结构体本身只是一系列不同类型元素的集合,若要访问某个struct的地址,需要加取地址运算符&。

数组可以直接利用下标访问,结构体必须使用结构中成员的变量名,即(struct)名字+‘.’(或"->")访问。

10.为什么计算机中的0.1+0.2 != 0.3

由于计算机是通过0和1二进制来计算,而0.1从十进制转换为二进制时是无法准确转换的,其转换结果是无穷循环小数,所以直接判断0.1+0.2==0.3时,其返回值为false。 在JAVA中采用BigDecimal类转换小数,然后用其add()方法进行判断,就可以准确转换0.1这个十进制小数。

补充
由于计算机内部表示浮点数的方式,浮点数的精度实际上取决于它们的大小。较大的数值具有较少的精度,这是因为它们的有效位数必须被用来表示更大的指数。这种精度问题可能导致一些计算结果出现误差。
舍入误差:当一个数不能精确地表示为一个有限的二进制数时,它会被舍入到最接近的有效值。这可能导致舍入误差。
溢出:当一个数的绝对值太大而无法在指定的数据类型范围内表示时,会发生溢出。这会导致结果为无穷大或NaN(不是一个数字)。
下溢:当一个数的绝对值太小而无法在指定的数据类型范围内表示时,会发生下溢。这会导致结果为0或非常接近0的值。

11.C和C++的区别

C语言是面向过程的语言,重点是算法和数据结构,C语言设计首先考虑的是如何通过一个过程,对输入信息进行运算处理得到输出结果。

C++是面向对象语言,首先考虑的是如何构造一个对象模型,让该模型与问题所契合,在C语言的基础上添加了面向对象、模板等特性,拓展了面向对象设计的内容,如类、继承、容器类(STL)等。

11.1C++的几个特性:

①封装性:封装使数据和加工该数据的方法封装为一个整体,把对象的设计者和对象的使用者分开,不必知晓其实现的细节,增加了安全性;

②继承性:子类共享父类之间数据和方法的机制。一个类直接继承其他类的全部描述,同时还可以修改(重写父类方法)和扩充。增强了代码的复用性。

③多态性:同一消息为不同的对象接收时可产生完全不同的行动。 使具有不同内部结构的对象共享相同的外部接口。增加了扩展性。

11.2指针和变量的自增自减的不同

指针的自增自减是改变指针的指向地址,变量的自增自减的改变变量的值。

11.3引用和值传递的区别

值传递是一个值的副本,函数对形式参数的操作不会影响实际参数的值;

引用传递的是引用对象的内存地址,函数对形参的操作会影响实际参数的值,实际参数的值会随着形式参数的值变化而变化。

11.4指针和引用的区别

引用在定义时被初始化一次之后就不可变,指针可以变;

引用不能为空,指针可以是空;

程序为指针变量分配内存区域,而引用不需要分配内存区域。

指针的自增自减是改变指针的指向地址,引用的自增自减是变量值的自增自减。

11.5面向对象和面向过程的区别

面向过程是一种以过程为中心的编程思想,以算法会核心。

面向过程的组成是:程序=算法+数据;

面向对象是一种以对象为中心的编程思想,以对 对象的操作消息作为核心;

面向对象的组成:程序=对象+消息;

面向对象的3要素:继承、封装、多态。面向对象中所有对象都可以归属一个类。

11.6 class类和struct结构体的区别

结构体存储在栈中,类的实例化可以存储在栈中,也可以存储在堆中;

结构体的执行效率比类要高;

结构体不支持继承,类支持继承。

11.7内联(inline)函数

在类声明的内部声明或定义的成员函数,在内联函数内不允许有循环语句和switch语句。

12.C++和JAVA的区别

JAVA是一种半解释半编译的语言,而C++只能在特定操作系统上编译并在特定系统上运行,是一步到位成机器语言的。

12.1指针

JAVA没有指针,C/C++中的指针操作内存,经常会出现错误。JAVA有效防止了一系列指针引起的操作层失误(如指针悬空造成了系统崩溃),更有利于JAVA程序的安全。

12.2自动内存管理

JAVA自动进行无用内存回收操作,不需要程序员手动删除。 JAVA中所有的对象都是用new操作符建立在堆栈上。当JAVA中一个对象不再被用到时,只需要给它添加删除标签,无用内存的回收器便利用空闲实践在后台运行。

而C++必须由程序始放内存资源。

12.3字符串变量

C和C++不支持字符串变量,虽然有string这个定义,但其实C++为程序员方便定义的一个类。 JAVA中字符串使用类对象(String和StringBuffer)来实现的。

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值