多益网络笔试题

第一部分是选择题,都不太会做,没印象了。。。

第二部分是填空题,记得一道问了避免线程死锁的四种方法

(1)避免循环等待: 确保线程获取资源的顺序是统一的,这样可以避免多个线程同时持有不同的资源,并试图获取对方已经持有的资源而造成的循环等待。

(2)使用加锁的顺序: 当线程需要获取多个锁时,确保它们以相同的顺序获取锁,可以减少死锁的发生。这样可以避免多个线程因互相持有对方需要的资源而发生死锁。

(3) 设置超时时间: 在获取锁的过程中设置超时时间,在尝试一段时间后没有成功获取锁,则放弃当前的操作,释放已获得的锁,并尝试其他策略,避免长时间等待导致死锁。

(4)死锁检测: 可以定期检测系统中的死锁情况,一旦检测到死锁,可以通过中断或者回滚操作来解除死锁状态。

第三部分是简答题

第一题是翻译题,没法记

第二题是 栈和堆的区别

(1)存储方式:

  • 栈(Stack): 栈是一种后进先出(LIFO)的数据结构,用于存储方法调用、局部变量和函数参数等。在程序执行时,每个线程都会有自己的栈空间,其中包含方法调用的参数值、返回地址以及局部变量。
  • 堆(Heap): 堆是一种动态分配的内存区域,用来存储程序运行时动态分配的数据。在堆中分配的内存需要手动释放,否则可能导致内存泄漏。

(2)分配方式:

  • 栈: 栈上的内存由系统自动分配和释放,是一种自动管理的内存分配机制。
  • 堆: 堆上的内存需要手动分配和释放,开发人员需要负责管理堆上的内存分配和释放,否则容易出现内存泄漏或内存溢出问题。

(3)访问速度:

  • 栈: 由于栈是连续存储的数据结构,访问速度较快,可以通过指针直接访问。
  • 堆: 堆是不连续存储的数据结构,访问速度较慢,需要通过指针间接访问。

(4)生存期:

  • 栈: 变量在栈上分配,其生命周期与所在函数的调用关系密切,函数返回时栈上的数据会被自动释放。
  • 堆: 堆上分配的数据的生命周期可以比较灵活,需要手动管理内存的分配和释放,因此可以在程序的任何地方使用。

第三题是哈希表,堆排序和快速的时间复杂度,哪种的效率快,什么情况下会导致该排序效率降低

哈希表的时间复杂度为O(n),堆排序的时间复杂度为O(nlogn),快速排序的时间复杂度为O(nlogn)【以上的时间复杂度为平均时间复杂度】。相比较下来哈希表的效率快,当哈希表效率降低的情况包括哈希冲突较多、数据量过大导致哈希表需要重新调整大小等情况。

补充:堆排序效率降低的情况:堆排序的效率并不会因为数据分布的不同而产生较大波动,但堆排序在实现上需要维护堆结构,如果实现不当或者对于大规模数据排序时,可能会占用较多内存空间。

 快速排序效率降低的情况:当数据集合已经有序或者接近有序时,快速排序的效率会变差,甚至在最坏情况下时间复杂度为 O(n^2)。此外,快速排序是一种不稳定排序算法,在某些情况下可能会导致效率降低。

第四题是mysql索引的优点和负面影响

优点:

(1)提高查询性能: 索引可以加快数据的检索速度,特别是对于大型数据表而言。通过在列上创建索引,可以减少数据库需要扫描的数据量,从而提高查询效率。

(2)加速数据的排序和分组: 索引不仅可以加快数据的查询速度,还可以加速数据的排序和分组操作。当涉及到排序或分组的操作时,索引可以帮助数据库更快地完成这些操作。

(3)加速表之间的连接: 当多个表之间存在连接操作时,索引可以加速表的连接过程,提高连接查询的效率。

(4)唯一性约束: 索引可以确保某列或某组列的唯一性,可以用于实现主键或唯一键约束,避免出现重复数据。

负面影响:

(1)占用存储空间: 索引需要额外的存储空间来存储索引数据结构,这可能会导致数据库文件变大,占用更多的磁盘空间。

(2)降低写操作性能: 当对表进行插入、更新和删除操作时,除了修改表数据外,还需要更新索引,这会增加写操作的时间和开销。

(3)维护成本高: 随着数据的增删改查,索引需要不断更新和维护,这会增加数据库的维护成本。

(4)可能引发查询优化器选择错误索引: 有时候数据库查询优化器可能会选择错误的索引,导致查询性能下降。

第五部分是编程题

题目:给定一个值sum,在S数组中找到两个值a、b;使得a+b最接近于sum;

思路:

1.将数组中的所有元素两两相加再减去给定的值sum,即a+b-sum

2.将差值添加进ArrayList集合,并对集合进行从小到大排序,此时ArrayList集合的首个元素为最小差值,即a+b与sum最接近

3.遍历数组两两相加减去给定的值sum等于最小差值,此时,相加的两个值即为所求a,b

(备注:如果小伙伴有更好的方法或是优化的代码,可以评论区告诉我一下,让我学习一下,十分感谢!!!)

代码:

package demo;

import java.util.ArrayList;
import java.util.Collections;

public class Demo10 {
    public static void main(String[] args){
        int[] arr = {1,3, 6,7};
        int sum = 10;
        int temp;
        ArrayList<Integer> chazhis = new ArrayList();
        //获取所有差值
        for (int i = 0; i < arr.length-2; i++){
            int L = i;
            int R = arr.length-1;
            while (R > L) {
                temp = arr[L] + arr[R]-sum;
                chazhis.add(Math.abs(temp));
                R--;
            }
        }
        //对集合从小到大排序
        Collections.sort(chazhis);
        //遍历数组,根据最小差值寻找a,b
        for (int j = 0; j < arr.length-2; j++){
            int L = j;
            int R = arr.length-1;
            while (R > L) {
                temp = arr[L] + arr[R]-sum;
                if (Math.abs(temp) == chazhis.get(0)){
                    System.out.println(arr[L] + "," + arr[R]);
                }
                R--;
            }
        }
    }
}

自我吐槽:扑街咯,这次笔试也一塌糊涂,对于数据结构还是要多去了解其优缺点,数据库索引得多多了解。笔试代码没写对,说明反应还是慢。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值