- 博客(94)
- 收藏
- 关注
原创 算法与数据结构(单词拆分)
动态规划这道题可以利用动态规划来判断字符串s是否能被拆分成字典wordDict中的单词。具体做法是:先将字典存入哈希集合以便快速查找,然后初始化一个dp数组,其中dp[i]表示s的前i个字符能否被拆分。初始时dp[0]设为true(空字符串可拆分),接着遍历字符串,对于每个位置i,检查所有可能的分割点j,如果前j个字符可拆分(dp[j]为true)且子串s[j..i-1]在字典中,则标记dp[i]为true。最终,的值即为整个字符串。
2025-03-29 16:33:44
420
原创 运维面试题(十一)
它们都是HTTP状态码,但它们表示不同的服务器问题。502错误意味着中间代理服务器(如负载均衡服务器或反向代理)从后端服务器接收到一个无效响应,504错误则表示中间代理服务器没有在规定时间内从后端服务器收到任何响应。外部依赖:如果CPU负载是由外部依赖引起的,比如数据库查询或网络请求,需要检查这些操作是否必要。对于高CPU进程,可以使用pidstat -t查看确定是哪个线程导致了高负载,会不会是某些函数或者是循环导致的。uffer:主要用于存储文件系统的元数据,例如inode和块设备的数据。
2025-03-28 19:38:17
585
原创 运维面试题(十)
检查内存使用:使用free -h 查看内存使用情况,判断是否是因内存不足导致交换频繁发生。磁盘I/O分析:利用iostat和iotop检查是否有进程导致磁盘I/O瓶颈。BIOS/UEFI:硬件初始化并加载Bootloade(读取磁盘第一个扇区)评估CPU的情况:使用top或htop来识别消耗大量CPU资源的进程。对于可疑进程,可以用ps -T -p<PID>查看其线程。网络流量监控:使用iftop监控网络流量。查看系统日志:查找应用程序异常退出的信息。内核:初始化硬件并挂载根文件系统。
2025-03-26 22:55:42
374
原创 运维面试题(九)
首先确定故障的范围以及模式:是否是所有网站都不可访问,故障的发生时间是否与网络变更重合。通过SHOW SLAVE STATUS确认卡住原因(IO/SQL线程错误或延迟)。1.如果公司内部网络出现部分用户无法访问外网的情况,你会如何进行故障排查?日志与监控分析:可以使用ELK搜索用户IP的相关拒绝记录。复制中断:网络故障或Binlog被清理导致从库缺失数据。复制延迟:主库高并发写入时,从库异步复制跟不上。检查一下DNS配置,看是否是DNS解析失败。网络问题则检查防火墙/DNS。SQL错误则跳过或修复数据。
2025-03-25 23:12:38
106
原创 运维面试题(八)
这是因为InnoDB支持行级锁定,这意味着在执行更新操作时,只有被修改的具体行会被锁定,而不是整个表。对于小型到中型的应用来说,它可能提供更好的性能,因为它使用表级锁定机制。仅支持INSERT和SELECT操作,适合只读或很少更新的数据。支持事务处理、行级锁定和外键约束,保证了数据的一致性和完整性。在早期版本中是默认存储引擎,但现在逐渐被InnoDB取代。提供高速查询和快速插入的能力,适合于读密集型应用。当MySQL重启或崩溃时,所有数据会丢失。支持高压缩率,但不支持索引,除了主键之外。
2025-03-24 21:54:48
188
原创 算法与数据结构(和为K的子数组)
这里引入了一个前缀和的概念。什么是前缀和呢?对于数组中的任意位置i,前缀和sum[i]为从第一个元素到第i个元素的元素和。这说明你要是想求第i+1到第j的子数组和,可以用sum[j]-sum[i]来计算。我们可以用哈希表来存储每个位置的前缀和以及它出现的次数。
2025-03-20 15:29:01
326
原创 运维面试题(六)
DNS查询:如果使用的是域名而非IP,浏览器需要DNS查询对应的IP。服务器接收到来自客户端的请求后,根据请求的内容决定如何响应。服务器准备好响应内容,通过之前建立的TCP连接发送给客户端。主键确保表中每一行数据都可以被唯一标识,避免数据重复。主键通常会自动创建一个唯一索引,加快基于主键的查询速度。连接建立后,浏览器构建并发送HTTP 请求至服务器。URL解析:检测URL是否合法,并尝试解析他。3.打开一个网址,到在加载出来的完整过程。浏览器与服务器建立TCP连接。
2025-03-19 23:48:21
259
原创 运维面试题(五)
交换空间是Linux系统用于扩展内存的一种机制,当物理内存不足时,系统会将部分不常用的内存数据转移到交换空间(通常是磁盘上的一个分区或文件),以释放物理内存供其他进程使用。当系统运行的应用程序占用了大量内存,操作系统会将不常用的内存页移动到交换空间,释放物理内存供其他应用程序使用。Traceroute:显示数据包从源主机到目标主机的路径,并测量每一跳的延迟。增加交换空间的使用可以缓解内存压力,但可能会降低系统性能。减少交换空间的使用可以提高系统性能,但会增加内存压力。性能优化:优化前端,后端和数据库性能。
2025-03-17 09:59:27
120
原创 运维面试题(四)
Docker Compose 和 Kubernetes(k8s)是两种常用的容器编排工具用于在单台主机上管理和编排多个容器的运行,适合小规模的部署K8s:用于在集群中自动化部署,扩展和管理容器化应用。适合生产环境,大规模部署。
2025-03-16 14:03:25
441
原创 运维面试题(三)
Filter表:用于过滤网络包,决定是否允许包通过nat表:用于网络地址转换,修改包的源或目标地址Mangle表:用于修改包的特定字段Raw表:用于配置连接跟踪的例外规则,通常用于不需要连接跟踪的包。Security表:用于强制访问控制网络规则通常与Selinux等安全模块配合使用。的。
2025-03-16 13:58:20
770
原创 运维面试题(二)
网段指的是一个子网的IP地址范围,包括网络地址和广播地址。首先你得知道你的IP和子网掩码,例如:IP 地址:192.168.1.0 → 11000000.10101000.00000001.00000000子网掩码:255.255.255.0 → 11111111.11111111.11111111.00000000其次,你需要分别确定网络部分和主机部分,子网掩码中1的部分是网络部分,0的部分是主机部分。计算网络地址和广播地址:网络地址是网络部分不变,主机部分全为0。
2025-03-15 13:11:00
167
原创 运维面试题(一)
Zookeeper的核心功能是提供分布式协调服务,确保分布式系统中的各个节点能够协同工作。当 Leader 失效时,ZooKeeper 会通过 ZAB 协议选举新的 Leader。存储限制:ZooKeeper 不适合存储大量数据,主要用于存储元数据和状态信息。复杂性:在大规模集群中,配置和管理 ZooKeeper 集群可能比较复杂。写性能瓶颈:写操作需要经过 Leader,可能成为性能瓶颈。由于数据的一致性,读操作不需要经过 Leader。高可用性:通过集群部署,确保服务的高可用性。
2025-03-15 00:14:47
301
原创 k8s面试题总结(十五)
ReplicatSet:是k8s中的控制器对象,用于确保在任何时间都有指定数目的pod副本,当有pod故障时,控制器会启动新的pod,确保达到指定的配置副本数量。水平扩展和负载均衡:水平扩展可根据需要调整pod的副本数量,结合负载均衡,k8s可以自动将流量分发到健康的pod上。使用标签为不同环境中的资源进行分类和标记,然后使用标签选择器在不同环境筛选和部署。命名空间是用于逻辑隔离和资源分组的一种方式,可以为每个环境创建单独的命名空间。可以设置节点级别的资源配额,限制节点上运行的pod使用的资源总量。
2025-03-13 22:59:45
349
原创 k8s面试题总结(十四)
另一方面,如果您的关注点更多是日志管理和分析,特别是对大规模日志数据的搜索、过滤和可视化,那么ELK Stack是更适合的解决方案。Helm:Helm Charts有公用的模板yaml文件,通过传递不同的变量,快速拉起一套新的服务,可在不同的环境中复用,并且可以共享和分发到Helm仓库。K8s提供了多种监控和日志记录解决方案,如Prometheus,ELK堆栈等,这些工具可以用于监控集群的性能指标和应用程序日志。Helm是一个k8s的包管理工具,它简化了应用程序在k8s集群中的部署,管理和维护。
2025-03-11 23:27:14
446
原创 k8s面试题总结(十三)
Service维护一个叫endpoint的资源列表,endpoint资源对象保存着service关联的pod的ip和端口。通过维护一套通用的Helm Charts,可以在不同的集群之间重复使用这些配置来部署相同的应用程序。命名空间是一种在Kubernetes集群中创建多个虚拟集群的机制,它可以用于隔离和管理不同的应用程序,团队或环境。标签作用:通过为资源对象添加标签,可以更灵活地组织以及管理它们,可以根据标签进行筛选。标签:k8s中的标签是键值对,用于对资源对象进行分类和标识。
2025-03-10 21:28:02
509
原创 算法与数据结构(回文数)
对于这个我的第一想法就是转换为字符串然后判断字符串是否为回文,它会消耗额外的地址空间。还有一种想法就是将数字反转并判断是否为回文,但可能需要处理数字溢出的问题。若要避免出现数字溢出的问题,我们可以只反转它的一半,若前半部分和后半部分相同,则说明它是一个回文数。如123321,我们将它的后半部分反转,得到123,它与前半部分相同,说明它是一个回文数。
2025-03-10 19:42:22
398
原创 k8s面试题总结(十二)
静态pod通常用于在k8s启动前启动一些核心服务(如网路插件CNI,DNS服务等),它能确保这些关键服务在kubelet启动时运行,不受API-Server服务的可用性以及网络故障的影响。Raft保证了数据的高可用性和一致性,确保在集群中的节点保持相同的数据状态。在etcd集群中,节点之间通过Raft一致性算法实现数据同步。
2025-03-09 17:01:46
782
原创 算法与数据结构(最长回文子串)
这个题可以用中心扩展法。遍历每个可能的中心点,然后向两边扩展,记录最长的回文子串。这样可以覆盖所有可能的奇数长度和偶数长度的回文情况。首先可以写一个扩展函数,返回值的类型为pair<int,int>。若left和right在字符串s的范围内且s[left] == s[right]则扩展一位(left--,right++)。最后返回满足条件的子串的范围。这个是用来求两种情况:子串长度为1,子串长度为2。若比end-start的长度长,则更新start和end的值。
2025-03-08 14:32:38
469
原创 算法与数据结构(两数相加)
首先判断其第一位数字是否已经相加,若没有,则给head,tail创建一个值为sum%10的ListNode新节点。因为两个链表都是逆序存储数字的,所以我们可以通过直接将各位的数字相加求得结果即可。最后,如果所有的数都加完了且carry不为0,则在最后补上值为carry的节点。(1)若l1链表不为空,则val1 = l1->val,否则为0。(2)若l2链表不为空,则val2 = l2->val,否则为0。否则,将创建一个ListNode新节点与tail相连。若链表不为空,则继续遍历。
2025-03-08 10:28:04
386
原创 K8s面试题总结(十一)
在Kubernetes中创建Deployment,指定镜像地址。将Docker镜像推送到镜像仓库(如Docker Hub)。
2025-03-08 00:09:58
387
原创 k8s面试题总结(十)
Shuffing: 将映射器输出的所有的键值对都收集起来,并根据键进行排序,排序后的键值对被分发给不同的Reducer。Mappping:每个分片(spilt)会被发送到一个或多个映射器,以键值对的方式存储每个单词以及它出现的次数。一个文件的大小为10K,一亿个文件为1TB,但他会消耗20GB的内存,所占内存太大。Spiltting:首先我们对所有的数据进行分片(splitting),如图,它被分为了三个部分。Reducing: 归约阶段,将相同键的键值对进行合并,得到最终的计数。最后,即可得到最终结果。
2025-03-06 14:52:16
1078
原创 k8s面试题总结(九)
Kubectl delete pod 名称 --force --grace-period=0(立即删除pod而不等待默认的优雅停机时长)(4)多阶段构建镜像,一个Dockerfile中,有两个基础镜像,上面基础镜像运行过程中的产物镜像,被下面的步骤接着引用。(1)Pod被其他资源(如Deployment,ReplicaSet)引用,无法删除pod。解决:先对节点进行诊断和修复,恢复到正常状态,再尝试删除pod。解决:先删除引用该pod的资源,再删除pod。解决:先解决pod的异常状态,再尝试删除。
2025-03-04 23:54:23
289
原创 k8s面试题总结(八)
这是因为k8s组件kubelet服务配置文件里没有配置本地监听端口或设置为了0,可以在本地kubelet服务配置文件中,将端口改成kubelet服务对应的端口,或注释里面的port=0。首先在pod的yaml文件里定义一个emptyDir空目录,挂载宿主机的临时目录,pod中的两个容器,同时挂载同一个名字,将资源挂载到自己容器的相应路径,这样两个容器就可以共享该数据资源了。有三种,分别是:nodeSelector、nodeAffinity、nodeName(一般不经过调度器,很少用)NodeSelector
2025-03-03 16:10:20
496
原创 k8s面试题总结(七)
(3)Scheduler调度服务会查看etcd数据库信息,判断这条信息是不是新来的,若是新来的就选择一个最合适的节点,将pod调度到节点上面,将调度信息更新到etcd数据库中。(2)K8s中的api-server接收到请求后,不是直接创建pod,而是生成一个创建pod信息的yaml文件,将yaml文件写入到etcd数据库中,添加一条记录。:普通 Service 会分配一个虚拟的 Cluster IP,用于负载均衡和代理流量,而 Headless Service 不会分配 Cluster IP。
2025-03-02 19:29:50
418
原创 k8s面试题总结(六)
Docker 可以将应用程序及其依赖打包成一个轻量级的、可移植的容器镜像。:Docker 提供了一个运行时环境,用于在主机上运行容器。kubernetes是一个容器编排平台,主要用于管理大规模的容器化应用程序。:Kubernetes 需要依赖(如 Docker)来创建和运行容器。:Kubernetes 在 Docker 的基础上提供了更高层次的抽象,用于管理大规模的容器化应用程序。
2025-03-01 14:13:20
379
原创 算法与数据结构(相交链表)
因为要求是否存在相交节点,那么我们就可以利用哈希集合先将listA链表里面的所有数据存入,然后访问listB,判断其是否有节点在哈希集合中,若存在,则说明此节点为相交的节点。接着用cur1和cur2变量用来遍历listA和listB链表,循环中用了三元运算符,就第一个来说,若cur1为空,则直接将cur1赋值为headB,若不为空,则继续往下移动。首先进行条件判断,若headA和headB中有一个为空,则说明不可能有相交节点,直接返回nullptr即可。切换到 listA 后,它走了。
2025-03-01 13:31:57
1035
原创 算法与数据结构(二叉树中的最大路径和)
这道题我们可以考虑用递归来解决。首先设计一个maxPath函数用来递归计算二叉树中一个节点的最大贡献值,具体来说,就是以该节点为根节点的子树中寻找以该节点为起点的一条路径,使得该路径上的节点值之和最大。如果该节点为空,则最大贡献值为0。如果非空,最大贡献值就等于节点值与其子节点中的最大贡献值之和。
2025-02-27 23:29:24
848
原创 k8s面试题总结(五)
CPU 与 Memory 是被 Pod 使用的,因此在配置 Pod 时可以通过参数 CPU Request 及 Memory Request 为其中的每个容器指定所需使用的 CPU 与 Memory 量,Kubernetes 会根据 Request 的值去查找有足够资源的 Node 来调度此 Pod。通常,一个程序所使用的 CPU 与 Memory是一个动态的量,确切地说,是一个范围跟它的负载密切相关:负载增加时,CPU 和 Memory 的使用量也会增加。需要一个完整的操作系统环境来支持该应用。
2025-02-26 23:42:19
166
原创 算法与数据结构(格雷编码)
已知n-1位的格雷码,如何得到n位的?方法是,首先将n-1位的格雷码列表逆序,然后每个数的最高位设为1,然后拼接到原来的列表后面。例如,n=1的格雷码是0,1。n=2的时候,将之前的逆序是1,0,然后前面加上最高位1,变成11,10,然后拼接到原来的00,01后面,得到00,01,11,10,对应十进制的0,1,3,2。如果i=1,就是1左移0位,其实他就是用来将第i-1位设为1,并添加到结果中。对于这个例子,n=2就是将第二位设为1,分别是11,10并添加到序列中,因为是逆序,所以先给1加,后给0加。
2025-02-25 18:14:44
650
原创 K8s面试题总结(四)
因为 kube-proxy 监听的端口在用户空间,所以需要一层 iptables 把访问服务的连接重定向给 kube-proxy 服务,这里就存在内核态到用户态的切换,代价很大,因此就有了iptables。① kube-proxy 不再负责转发,数据包的走向完全由iptables规则决定,这样的过程不存在内核态到用户态的切换,效率明显会高很多。② 但是随着 service 的增加,iptables 规则会不断增加,导致内核十分繁忙(等于在读一张很大的没建索引的表)。
2025-02-25 17:47:23
164
原创 K8s面试题总结(三)
① Minikube 是一种可以在本地轻松运行一个单节点 Kubernetes 群集的工具。② Kubectl 是一个命令行工具,可以使用该工具控制Kubernetes 集群管理器,如检查群集资源,创建、删除和更新组件,查看应用程序。③ Kubelet存在于每个节点上,负责与API-Server进行通信,监控并管理pod中的容器。
2025-02-24 15:39:06
192
原创 算法与数据结构(不同路径)
其实这道题就是一个简单的动态规划问题,因为机器人只能往右或往下移动,所以一个点的路径种类数就等于它上面点的路径种类数加上它左边点的路径种类数。我们用f(i)(j)来代表从左上角走到(i,j)的路径数量,对于列为0和行为0的所有点路径数量都是1。之后利用f[i][j] = f[i-1][j] + f[i][j-1]即可求出每个点的路径数量。之后返回f[m-1][n-1]就可以知道总共的路径数量。它们只有一种路径到达,将其初始化。
2025-02-24 15:18:08
390
原创 算法与数据结构(旋转链表)
定义一个cur变量用来遍历到最后一个节点,方便后面的插入,a为移动节点的个数,iter变量从头开始遍历,将每个节点不断地往后插入。插入完毕后,将最后一个节点的next指向空即可。如上图所示的示例1,先将1插入到5的后面,再将2插入到1的后面,最后将3插入到2的后面即可。每个节点向右移动k个位置,其实就是从头开始遍历,将n-k个节点顺序插入到链表的尾部。iter即为新链表的头结点。
2025-02-23 18:15:43
259
原创 算法与数据结构(环形链表II)
若可以相遇,则将链表的开头定义为ptr,ptr和slow每次分别移动一格,当ptr将a走完的时候,一定会与slow在入环的第一个节点相遇,此时返回ptr即可。若我们继续用哈希表还是很简单,就是继续遍历链表,遇到的第一个重复的值即为入环的第一个节点。若相遇,则慢指针的移动距离为a+b,快指针移动的距离为a+n(b+c)+b。快指针的移动距离是慢指针的2倍,由此可知a+n(b+c)+b=2(a+b)。则a=(n-1)b+nc , a=(n-1)(b+c)+c。所以a的距离就等于n-1圈的距离加上c。
2025-02-22 11:36:06
1079
原创 算法与数据结构(环形链表)
初始时,将慢指针定义在位置head,而快指针在位置head->next。这样一来,如果在移动的过程中,快指针反过来追上慢指针,就说明该链表为环形链表。否则快指针将到达链表尾部,该链表不为环形链表。我们可以遍历链表的所有节点,每当遍历到一个节点时,我们可以判断此节点之前是否被访问过。若被访问过,则说明一定是环形链表,返回true。我们可以这样想,若目标是环形链表,我们就会不断地在里面循环,若不是,最后肯定会遍历到nullpter。我们可以定义两个指针,慢指针每次移动一步,快指针每次移动两步。
2025-02-22 09:20:27
474
原创 算法与数据结构(螺旋矩阵II)
从左到右、从上到下、从右到左、从下到上的顺序逐层填充矩阵,每完成一层后收缩边界,直到所有数字都被填入矩阵为止。这个题目其实与之前的螺旋矩阵非常相似,之前是从已有的数据中读取数据,这个是你自己往矩阵里面加入数据。我们先创建一个m:n*n的矩阵,将里面的数据全部初始化为0。接着顺时针访问矩阵,将k不断地附加到矩阵中的相应位置即可。这段代码的思路是通过模拟螺旋填充的方式,将从。具体来说,使用四个边界变量()来控制填充的范围,按照。
2025-02-20 13:49:01
265
原创 算法与数据结构(螺旋矩阵)
(2)接着判断若left<right && top<bottom,则执行以下操作。对于这种矩阵,我们可以看成一层一层,先遍历最外层,然后到次外层,最后再到里层。首先求出矩阵的行数以及列数,若行数为0或列数为0,则直接返回一个空数组。(1)若left<=right && top<=bottom则进入循环。调整四个变量的值,若还满足循环条件,则继续执行,以此类推。先遍历最上层的数,接着遍历最右侧的数。接着定义上下左右四个坐标的位置。从右往左遍历,从下往上遍历。从最上层开始顺时针遍历。
2025-02-19 08:58:54
273
原创 算法与数据结构(子集)
对于nums中数组中的数,分为两个状态,一种是在子集里,我们假设它为1。一种是不在子集里,我们假设它为0。假设数组为3,4,7,要求它们的子集,则如下图。对于上述例子,i就会从0遍历到7。若为1,则就将那一位所代表的数插入到t数组中。每一位都确定好之后,就会将t插入到ans中。t.clear()的作用是清空t数组,因为它不断地求每个子集,如果不清除,就会一直往里面加数据,导致ans里面数组的子集有重复的。我们可以对i进行枚举,从0到2^len-1。建立ans用来存放子集,t用来存放临时的子集。
2025-02-18 12:15:53
222
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人