两个算法题全都用动态规划AC100%了,选择题有一些不太确定的。
- IPv6的压缩表示法:
- 前导零压缩,在每组四个十六进制数字中可以省略每个段的前导零;
- 在IPv6地址中出现连续多个全为零的字段时,可以使用双冒号替代这些字段,需要注意的是整个地址中只能使用一次::,以确保地址的唯一性。如原地址
1234:1234:0000:0000:0000:0000:3456:3434,压缩以后:1234:1234::3456:3434。
- IPV6的本地地址范围?
链路本地地址
- 地址范围:
FE80::/10 - 用途:链路本地地址用于单条链路,主要在同一局域网内进行通信。这类地址不能被路由,并且不需要全局前缀,因此非常适合于自动配置机制、邻居发现进程以及没有路由器的网络上。链路本地地址通常用于设备之间的直接通信,比如在一个小型网络或临时网络中。
站点本地地址
- 地址范围:
FEC0::/10 - 用途:站点本地地址类似于IPv4中的私人地址,用于仅在特定站点内部进行通信。这些地址设计用于不会与全球IPv6互联网进行通信的设备,如内部打印机、服务器等。站点本地地址通过54位子网ID和64位主机ID来唯一标识网络内的设备。值得注意的是,站点本地地址在IPv6标准中已被弃用,推荐使用Unique Local Addresses(ULA),范围为
FC00::/7。
- 设置相对定位会影响元素层级吗?
- 设置相对定位不会直接提升元素的层级,但它可以间接影响元素的层级关系。
- 在 CSS 中,元素的层级主要由
z-index属性控制。默认情况下,所有元素的定位类型都是静态(static),这意味着它们会按照文档流的顺序排列且不会响应z-index属性。当你将一个元素设置为相对定位(relative)时,该元素仍然保持在文档流中,但其位置可以相对于自身的原始位置进行调整。 - 绝对定位和固定定位确实会提升元素的层级,因为它们使元素脱离文档流,从而影响其在页面上的相对位置及叠加顺序。
- 盒模型有哪些?
标准盒模型(W3C标准模型) :
-
在这种模型中,元素的总宽度和高度是由内容、内边距和边框的大小共同决定的。
-
计算公式:
总宽度 = 内容宽度 + 左内边距 + 右内边距 + 左边框 + 右边框 总高度 = 内容高度 + 上内边距 + 下内边距 + 上边框 + 下边框
怪异盒模型(IE盒模型) :
-
在这种模型中,内容的宽度和高度包括了内边距和边框的大小。这意味着设置的宽度和高度会包含内边距和边框。
-
计算公式:
总宽度 = 宽度 + 左内边距 + 右内边距 + 左边框 + 右边框 总高度 = 高度 + 上内边距 + 下内边距 + 上边框 + 下边框
- 哪些方式可以声明全局变量
使用 var 声明
在函数外部使用 var 关键字声明变量会创建一个全局变量。
如果是在函数内部的话声明的也是局部变量,但是会进行变量提升,可以先访问再声明。
使用 let 和 const 声明
尽管 let 和 const 通常用于块级作用域,但如果在全局作用域中使用它们,也会创建全局变量。
隐式声明
如果在没有使用 var、let 或 const 的情况下为一个变量赋值,它会自动成为全局变量。这种方式被认为是不推荐的,因为它可能导致意外的命名冲突。
不过这种方式可以在函数内部创建全局变量。
将属性添加到 window 对象
在浏览器环境中,可以通过将变量赋值给 window 对象来创建全局变量
例如:
window.globalWindowVar = "I am a global variable via window object";
6. js中的substr()和substring()方法区别:
substring(startIndex, endIndex) :
-
用于提取从
startIndex到endIndex - 1(也就是说不包含endIndex!)的子字符串。如果省略endIndex参数,则提取从startIndex到字符串末尾的所有字符。 -
substr(startIndex, length): -
用于提取从
startIndex开始的指定长度(length)的子字符串。如果省略length参数,则会提取从startIndex到字符串末尾的所有字符。 -
substring会将负数参数视为 0,如果传入负值,将从字符串的开头开始截取。 -
substr允许第一个参数为负数,此时它会从字符串的末尾开始计算。例如,str.substr(-6, 5)将返回"World"。 -
在
substring中,如果第一个参数大于第二个参数,它会自动交换这两个参数的值,比如str.substring(5, 0)会返回与str.substring(0, 5)相同的结果。 -
而在
substr中,参数的顺序是严格的,不会交换。str.substr(5, 0)返回空字符串。
现在已经不推荐用substr,而是用substring或slice
array.slice(start, end);
-
start: 可选参数,表示提取的起始索引(包含该索引)。
-
end: 可选参数,表示提取的结束索引(不包含该索引)。如果省略,则会一直提取到数组或字符串的末尾。
-
不改变原数组/字符串:
slice方法不会修改原有的数组或字符串,而是返回一个新的副本。 -
支持负数索引: 如果
start或end为负数,表示从数组或字符串的末尾开始计数。例如,-1表示最后一个元素。
这几个方法都不会改变原数组或字符串。
- webworker可以访问到的对象(我不知道,选的window)
Web Worker 是一种提供在后台线程中运行 JavaScript 的机制,从而实现多线程环境。Web Worker 的设计目的是让复杂的计算任务不会阻塞用户界面,保持应用的响应性。
Web Worker 访问的对象
全局上下文:Web Worker 在一个独立的线程中运行,有自己的全局上下文。这意味着在 worker 中,window 对象不可用,而是使用 WorkerGlobalScope。这允许 workers 使用一些特定于 worker 的 API,如 self(指向当前 worker 的全局对象)。
可用的 API 和功能:
- XHR 和 Fetch:Worker 可以使用 XMLHttpRequest 进行网络请求,也可以使用 fetch API。不过需要注意,某些属性(如 responseXML 和 channel)在 worker 中总是为空。
- 基本的 JavaScript 对象:在 worker 中,你可以使用标准的 JavaScript 对象和方法,例如 Array、Object、String 和 JSON 等。
- 定时器:Worker 支持使用 setTimeout 和 setInterval,但不支持 DOM 相关的方法。
数据传输:Worker 与主线程之间的通信是通过消息传递来实现的。你可以使用 postMessage() 方法将数据从主线程发送到 worker,或反之。然而,worker 和主线程之间并不能直接共享对象;它们需要通过克隆数据(例如通过 structured clone algorithm)来实现通信。
限制:Worker 在很多方面与主线程不同,比如不能直接操作 DOM、无法使用 localStorage 或 sessionStorage,以及不支持某些全局函数(如 alert、confirm)。因此,在设计 worker 时,需要考虑这些限制。
- java.lang.outOfMemoryError:Java heap space表示什么问题
java.lang.OutOfMemoryError: Java heap space 是一种 Java 运行时错误,表示 Java 虚拟机(JVM)无法为新对象分配足够的内存空间。这通常发生在以下几种情况下:
1. 堆内存不足
- JVM 在启动时会分配一定量的堆内存,用于存储 Java 对象。
OutOfMemoryError: Java heap space表示当前的堆内存已经被用完,无法再为新的对象分配内存。
2. 常见原因
- 大数据集处理:应用程序尝试处理的数据集超出了 JVM 分配的堆内存。例如,在读取大型文件或处理大量数据时,可能会遇到此错误。
- 内存泄漏:如果应用程序中的某些对象持续持有引用,但不再需要它们,导致垃圾回收器无法回收这些对象,就会引发内存泄漏,最终导致堆内存耗尽。
- 配置不当:JVM 启动时的堆内存配置(如
-Xmx和-Xms参数)过小,无法满足应用程序的需求。
-
给了一堆代码,关于WAF(web应用防火墙设置),看都看不懂hhh
-
哪些排序算法是稳定的,哪些是不稳定的?
稳定:冒泡、插入、归并、基数;
不稳定:选择、快速、希尔、堆。
八大排序算法及其时间复杂度
-
冒泡排序
- 时间复杂度:O(n²)
- 描述:依次比较相邻的两个元素,如果顺序不对则交换位置,直到遍历完所有元素。
-
选择排序
- 时间复杂度:O(n²)
- 描述:每次从未排序部分选择最小(或最大)元素,并与已排序部分的最后一个元素交换。
-
插入排序
- 时间复杂度:O(n²)
- 描述:逐步构建已排序的数组,将每个新元素插入到已排序部分。
-
希尔排序
- 时间复杂度:O(n log n) 至 O(n²)(依赖于增量序列)
- 描述:基于插入排序的改进,通过将数据分成多个子序列进行排序,从而提高效率。
-
快速排序
- 时间复杂度:O(n log n)(平均情况),O(n²)(最坏情况)
- 描述:采用分治法策略,选择一个枢轴元素,将比它小的元素放在左边,比它大的放在右边,然后递归处理。
-
归并排序
- 时间复杂度:O(n log n)
- 描述:采用分治法,先将数组分割成两半,分别排序后合并。
-
堆排序
- 时间复杂度:O(n log n)
- 描述:利用堆这种数据结构,通过构建最大堆或最小堆来实现排序。
-
计数排序
- 时间复杂度:O(n + k)
- 描述:适用于范围有限的整数排序,通过统计每个元素出现的次数来构建有序数组,k 是输入数据的范围。
-
关于SSE 服务器推送事件
- Sse技术详解:一种全新的html5服务器推送事件技术 - 知乎
- Server-Sent Events 教程 - 阮一峰的网络日志
- Sse(服务器推送事件)的介绍、问题及解决 - Csdn博客
- 服务端实时推送技术之SSE(Server-Send Events)-CSDN博客
- SSE(Server-Send Events)实战 - 知乎
服务器推送事件(Server-Sent Events,简称SSE)是一种用于从服务器向浏览器实时推送数据的技术。它是HTML5规范的一部分,提供了一种简单而有效的方法来实现服务器主动发送信息到客户端。
SSE的工作原理
-
持久连接:SSE通过HTTP协议建立一个持久的连接。当客户端向服务器发送请求后,服务器保持这个连接,并在有新数据时不断推送消息,而不需要客户端不断地发起新的请求。
-
流式传输:SSE使用流信息(streaming)的方式传输数据,这意味着服务器可以连续不断地发送数据给客户端,而不是一次性发送完。因此,客户端只需处理接收到的新数据,节省了频繁建立和关闭连接的开销。
-
基于HTTP协议:SSE依赖于HTTP,除了IE/Edge,其他主流浏览器均支持此技术。
-
单向通信:数据从服务器单向推送到客户端,客户端不能直接向服务器发送信息,但可以通过其他方式(如AJAX)进行交互。
-
自动重连:在连接中断时,SSE能够自动尝试重新连接,保持数据传输的持续性。
应用场景
SSE特别适合需要实时更新的应用场景,例如:
- 股票价格更新:当股市出现变化时,可以通过SSE立即向用户推送最新的价格信息。
- 社交媒体通知:用户的消息、评论等动态更新可以即时发送到浏览器。
- 在线游戏状态更新:游戏中的动作或状态改变可以实时通知玩家。
相较于其他技术
与其它技术(如WebSocket或长轮询)相比,SSE更易于使用,特别是在只需单向数据流的情况下。WebSocket虽然提供双向通信,但实现复杂。而长轮询则需要频繁地建立连接,造成更多的网络开销。
- 如果X、Y都服从于N(μ2,sigema2),那么P{|X-Y|<1}和μ2、sigema2有关系吗?
(P{|X - Y| < 1}) 与sigema2有关,但与μ2无关。
- 最后一道算法题
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> X(n);
vector<int> Y(n);
vector<int> V(n);
for (int i = 0; i < n; i++) {
cin >> X[i];
}
for (int i = 0; i < n; i++) {
cin >> Y[i];
}
for (int i = 0; i < n; i++) {
cin >> V[i];
}
vector<vector<int>> dp(n, vector<int>(2, 0));
dp[n - 1][0] = 0;
dp[n - 1][1] = V[n - 1];
for (int i = n - 2; i >= 0; i--) {
if (X[i + 1] > X[i] + Y[i]) {
dp[i][0] = max(dp[i + 1][1], dp[i + 1][0]);
dp[i][1] = max(dp[i + 1][1], dp[i + 1][0]) + V[i];
} else {
int flag;
for (int j = n - 1; j > i; j--) {
if (X[j] <= X[i] + Y[i]) {
flag = j;
break;
}
}
if (flag == n - 1) {
dp[i][1] = V[i];
} else {
dp[i][1] = max(dp[flag + 1][0], dp[flag + 1][1]) + V[i];
}
dp[i][0] = max(dp[i + 1][1], dp[i + 1][0]);
}
}
cout << max(dp[0][0], dp[0][1]) << endl;
return 0;
}