牛客网面试题一

说一说 Linux 如何管理内存

Linux 系统中的内存管理是一个复杂的过程,但是我们可以通过以下几个方面来理解它的基本原理。

  1. 内存分配
    在 Linux 中,内存分为两种类型:用户态和内核态。用户态内存由用户进程自行分配,内核态内存由内核统一管理。内核会自动管理内存的分配和回收,在需要内存时会通过内存调度算法将可用的空闲内存分配给进程,当需要释放内存时,则将已使用的内存回收。
  2. 内存回收
    Linux 在内核中引入了一种称为页面换入和换出的机制来进行内存回收。在内存不足时,这个机制会通过将某些进程的内存页面换出到磁盘(称为交换空间)上,以腾出更多的内存空间。当这些进程再次需要这些页面时,它们会再次被换入并重新映射到内存中。
  3. 内存优化
    内核为应用程序提供了许多优化选项,如透明大页、内存释放、页面空洞(拆分聚合的页面)以及基于 NUMA 的内存分配等。这些功能可以提高系统的内存性能,使得内存的使用更加高效。

总之,Linux 的内存管理是一个复杂的过程。

HTTPS协议非对称加密的过程?

HTTPS协议使用的是非对称加密的方式来保障通信过程的安全性,这种加密方式需要两个不同的密钥:公钥和私钥。公钥由网站的服务器保存,私钥则保存在服务器外部的受信任设备中,比如用户的计算机。

以下是 HTTPS 协议的非对称加密过程:

  1. 客户端向服务器发送请求,请求中包含了客户端支持的加密方法列表。
  2. 服务器接收到请求后会向客户端发送公钥。
  3. 客户端收到公钥后使用它对生成一个随机密钥进行加密,然后将加密后的密钥发送给服务器。
  4. 服务器使用私钥将加密的密钥进行解密,然后使用这个密钥加密要发送的数据。
  5. 服务器将加密后的数据发送给客户端。
  6. 客户端使用之前生成的随机密钥进行解密,得到明文数据。
    在这个过程中,公钥是公开的,任何人都可以获得和使用它。而私钥则是非常重要的,只有服务器和受信任的设备才有权使用它。由于这种加密方式支持公钥和私钥的分离,因此可以保证在通信过程中数据的机密性和完整性。

HTTP协议的缓存策略有哪些?

HTTP缓存是指把已经访问过的资源存储到本地,以便于下次访问时可以快速获取并显示,从而提高网站的性能和减少带宽消耗。HTTP协议的缓存策略主要有以下几种:

  1. 强缓存:浏览器在第一次请求资源时,服务器会将资源的过期时间通过HTTP响应头(Expires或Cache-Control)返回给客户端。客户端再次请求该资源时,如果当前时间尚未超过过期时间,浏览器将直接从本地缓存读取该资源,而不是向服务器请求。这种缓存策略可以显著提高访问速度,但可能会导致一些更新后的资源无法获取到。

  2. 协商缓存:当浏览器请求缓存过期的资源时,服务器会返回一个带有 ETag 或 Last-Modified 的响应头。当下次请求该资源时,浏览器会在请求头中携带上次请求中的 Last-Modified 或 ETag,服务器通过比对是否与最新的版本相同,来决定返回新的资源或者304状态码,让客户端使用本地缓存。这种缓存策略可以在保证获取到最新资源的同时减少网络请求次数。

  3. 离线缓存:HTML 5新特性中,通过使用浏览器的本地缓存机制缓存 Web 应用资源以及页面内容,可以使 Web 应用离线后仍然可以继续使用。这种缓存策略可以避免离线情况下访问繁琐的网络请求。

综上所述,HTTP缓存可以显著提高网站性能和用户体验,同时减少网络请求消耗。不同的缓存策略有着不同的优缺点,我们需要在实际应用中根据具体场景进行选择和配置。

UDP(用户数据报协议)是什么?

UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,它在IP协议的基础上提供了数据报的支持,不保证数据传输的可靠性和有序性。UDP主要用于实时应用,如视频会议、在线游戏等。

与TCP相比,UDP的主要特点如下:

  1. 无连接:UDP协议不需要在发送数据之前进行建立连接,可以直接将数据发送给对端。这样可以减少传输时的数据头和状态信息,提高传输效率和速度。

  2. 不可靠:由于UDP协议不保证传输的可靠性和有序性,发送方无法确认接收方是否收到了数据包,也无法保证数据包的顺序。因此,UDP协议不适用于需要可靠传输的场景。

  3. 快速:UDP协议发送数据的时间和频率不受拥塞控制、流量控制等机制的影响,可以更快地将数据传输到对端。

  4. 轻量级:UDP协议的头部较短,只有8个字节,与TCP的头部相比较轻量级。

总之,UDP协议是一种简单、快速、轻量级的协议,适用于需要高效传输数据的场景,但不适用于需要可靠传输和有序性的场景。

js代码题

第一题:
假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天
2.如果不能获取到任何利润,请返回0
3.假设买入卖出均无手续费

第二题:
在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)

题目分析:

买入卖出股票使得收益最大,其实质是求解数组中最小值和最大值的差
JavaScript代码如下:

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function(prices) {
    
    
    let minPrice = prices[0] //记录最小股票价格
    let maxProfit = 0 //记录最大收益
    
    for(let i = 1; i < prices.length; i++) {
    
    
        //如果当前股票价格比之前记录的最小股票价格更低,那么更新最小股票价格
        if(prices[i] < minPrice) {
    
    
            minPrice = prices[i]
        } else {
    
     
            //否则,如果当前股票价格与之前记录的最小股票价格之差大于记录的最大收益,那就更新最大收益
            maxProfit = Math.max(maxProfit, prices[i] - minPrice)
        }
    }
    return maxProfit //返回最大收益
};

题目分析:

本题可以使用哈希表来存储字符出现的次数,然后查找第一个出现次数为1的字符的位置即可。注意,题目中要求区分大小写,因此在存储字符次数时,要对字符转换为小写。

JavaScript代码如下:

/**
 * @param {string} s
 * @return {number}
 */
var firstUniqChar = function(s) {
    
    
    let hash = {
    
    } //哈希表,用来存储字符出现次数
    
    //遍历字符串s,记录每个字符出现的次数
    for(let i = 0; i < s.length; i++) {
    
    
        let c = s[i].toLowerCase() //将字符转换为小写
        if(c in hash) {
    
     //如果字符已经出现过,就增加次数
            hash[c]++
        } else {
    
     //如果字符没出现过,就在哈希表中记录它的次数
            hash[c] = 1
        }
    }
    
    //再次遍历字符串s,查找第一个出现次数为1的字符
    for(let i = 0; i < s.length; i++) {
    
    
        let c = s[i].toLowerCase() //将字符转换为小写
        if(hash[c] === 1) return i //如果出现次数为1,就返回它的位置
    }
    
    return -1 //如果没有出现次数为1的字符,就返回-1
};

猜你喜欢

转载自blog.csdn.net/weixin_63929524/article/details/130436057