likes
comments
collection
share

字节二面 广智救我字节一面爽歪歪,黑神话悟空开心挤爆大头儿子,却没想被广智给灭了。却也没想,字节二面面试官,也是个广智,

作者站长头像
站长
· 阅读数 38

字节二面 广智救我字节一面爽歪歪,黑神话悟空开心挤爆大头儿子,却没想被广智给灭了。却也没想,字节二面面试官,也是个广智,

字节一面爽歪歪,黑神话悟空开心挤爆大头儿子,却没想被广智给灭了。却也没想,字节二面面试官,也是个广智,把我虐的妥妥的。

字节二面

1. 死锁有什么解决办法

我面的是前端岗吗? 我在哪里?仿佛落到了如来佛祖手心,只能到此一游了。各位,408字节考的还是挺多的....

死锁是指在多线程或多进程环境中,两个或多个进程相互等待对方释放资源,从而导致所有进程都无法继续执行的情况,是操作系统中的一个重要概念。

假设系统中有两个线程(Thread A 和 Thread B)和两个资源(Resource 1 和 Resource 2),死锁可能发生的具体场景如下:

  1. Thread A 获取了 Resource 1 的锁。
  2. Thread B 获取了 Resource 2 的锁。
  3. Thread A 需要获取 Resource 2 才能继续执行,但 Resource 2 已被 Thread B 占用,所以 Thread A 进入等待状态。
  4. Thread B 需要获取 Resource 1 才能继续执行,但 Resource 1 已被 Thread A 占用,所以 Thread B 也进入等待状态。

此时,Thread AThread B 都在等待对方释放资源,导致两个线程都无法继续执行,从而进入了死锁状态。

怎么解决:

锁超时 (Lock Timeout) 在获取锁时设置超时时间,如果一个线程在超时后还没有获得锁,就自动放弃锁并回滚操作。这种方法可以避免线程长时间等待,虽然不能完全防止死锁,但可以减少死锁的发生几率。

死锁预防 (Deadlock Prevention)

  • 互斥 (Mutual Exclusion) : 尽量减少资源的独占使用,例如使用可共享的资源。

  • 占有且等待 (Hold and Wait) : 在获取资源之前,进程必须先释放所有持有的资源,或者在开始执行前一次性申请所有资源。

  • 不可剥夺 (No Preemption) : 允许操作系统强制剥夺某个进程的资源,以避免死锁。

  • 环路等待 (Circular Wait) : 规定资源的申请顺序,例如按照资源的序号依次申请,防止形成循环等待。

死锁避免 (Deadlock Avoidance)

  • 银行家算法 (Banker's Algorithm) : 在进程申请资源时,系统通过模拟分配判断是否进入不安全状态,如果不会导致不安全状态,则允许分配资源;否则,拒绝分配,避免死锁。

2. 假如没有ip地址只使用Mac地址会有什么问题

  • IP地址是用于在计算机网络中标识设备位置的唯一地址,帮助设备进行数据通信和路由。
  • MAC地址是网络设备的物理地址,由制造商分配,用于在局域网内唯一标识设备并控制网络通信。
  • IP地址用于在网络层标识设备的位置,以便在不同网络之间路由数据,而MAC地址用于在链路层唯一标识设备,确保在同一局域网内可靠地传输数据。两者结合使用,使得数据能够准确地找到并传送到目标设备,无论是在局域网内还是跨网络的通信中。

字节二面 广智救我字节一面爽歪歪,黑神话悟空开心挤爆大头儿子,却没想被广智给灭了。却也没想,字节二面面试官,也是个广智,

如果没有IP地址,只使用MAC地址,通信将局限于局域网内,无法实现跨网络的数据传输和路由。MAC地址是固定的物理地址,无法适应不同网络拓扑结构,导致设备无法在广域网或互联网中有效定位和通信,网络扩展性和管理性会受到严重限制。此外,数据包的路由将变得复杂和低效。

3. css中怎么让一段文字的首字加粗和字体变大

::first-letter伪元素来使文本的首字母加粗并变大

p::first-letter { 
font-weight: bold; /* 加粗 */
font-size: 2em; /* 使字体变大 */ }

4. css中的长度单位你知道多少?有什么区别?

CSS中的长度单位有很多种,主要可以分为绝对单位和相对单位。

绝对单位

  1. px (像素) :最常用的单位,表示屏幕上的一个点。它是绝对的,与设备分辨率无关。

相对单位

  1. em:相对于父元素的字体大小。如果父元素的字体大小是16px,1em等于16px。
  2. rem (根em) :相对于根元素(<html>)的字体大小。更适用于全局字体大小设置。
  3. % (百分比) :相对于父元素的尺寸。例如,宽度为50%意味着子元素宽度为父元素宽度的50%。
  4. vw (视口宽度) :相对于视口宽度的百分比。1vw等于视口宽度的1%。
  5. vh (视口高度) :相对于视口高度的百分比。1vh等于视口高度的1%。

区别

  • 绝对单位 通常用于需要精确控制元素尺寸的场景,例如打印样式。
  • 相对单位 更具灵活性,适用于响应式设计和布局调整,因为它们与父元素或视口大小相关联。

5. 手写Promise.all

function myPromiseAll(promises) {
    // 返回一个新的 Promise
    return new Promise((resolve, reject) => {
        // 如果输入的不是数组,直接返回一个拒绝的 Promise
        if (!Array.isArray(promises)) {
            return reject(new TypeError('Argument must be an array'));
        }
        
        // 保存所有 Promise 结果
        let results = [];
        // 记录已完成的 Promise 数量
        let completed = 0;
        // 记录总 Promise 数量
        const total = promises.length;

        // 如果数组为空,直接返回一个已解析的 Promise
        if (total === 0) {
            return resolve(results);
        }

        // 遍历所有传入的 Promise
        promises.forEach((promise, index) => {
            // 确保每个项都是 Promise 实例
            Promise.resolve(promise)
                .then(value => {
                    // 记录每个 Promise 的结果
                    results[index] = value;
                    completed += 1;

                    // 如果所有 Promise 都已完成,返回结果数组
                    if (completed === total) {
                        resolve(results);
                    }
                })
                .catch(error => {
                    // 如果任何一个 Promise 被拒绝,返回拒绝的 Promise
                    reject(error);
                });
        });
    });
}

// 使用示例
const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);
const p3 = new Promise((resolve) => setTimeout(resolve, 100, 3));

myPromiseAll([p1, p2, p3])
    .then(results => console.log(results)) // [1, 2, 3]
    .catch(error => console.error(error));

6. vue的两种路由方式怎么实现的

vue-router 支持两种主要的路由方式:哈希模式(Hash Mode)和 历史模式(History Mode)

1. 哈希模式(Hash Mode)

哈希模式 是 Vue Router 的默认路由模式,它使用 URL 的哈希部分(#)来保存路由状态。这样,路由变化不会引起页面的刷新,也不会与服务器的路由冲突。

2. 历史模式(History Mode)

历史模式 通过 HTML5 的 History API 实现路由。它不使用哈希(#),而是直接使用 URL 的路径部分。历史模式可以使 URL 更加干净,但需要服务器配置以支持前端路由。

服务器配置(仅针对历史模式)

使用历史模式时,你需要配置服务器,以便在刷新页面或直接访问某个路由时,服务器能够返回 index.html 文件,而不是返回 404 错误。以下是一些常见服务器的配置示例:

server {
  listen 80;
  server_name yourdomain.com;
  root /path/to/your/dist;

  location / {
    try_files $uri $uri/ /index.html;
  }
}
  • hashMode 用的是hashChange事件,historyModel用的是pushState/replaceState/popstate

7. 项目里为什么选择JWT

相比较于cookie, JWT 有以下优势:

  • 无状态认证

JWT 是无状态的,这意味着服务器不需要存储用户的会话数据。所有需要的信息都包含在 JWT 中,服务器通过验证 JWT 来确认用户身份。

这减少了服务器的开销,特别适合分布式系统和微服务架构,因为每个服务节点都可以独立验证 JWT,而无需共享会话数据。

基于服务器会话的 Cookie 认证通常需要在服务器端存储会话数据,增加服务器开销,并且在分布式架构中需要共享会话状态,管理复杂,不如无状态的 JWT 适合分布式系统。

  • 跨域和跨服务通信

    特点: JWT 是自包含的,可以在不同的域名或服务之间安全传递。 优势: 在微服务架构中,JWT 可以被多个服务使用,方便在不同服务间传递用户身份,避免了跨域请求的复杂性。

  • 易于扩展

特点: JWT 可以包含自定义的声明(claims),这些声明可以携带用户角色、权限或其他重要信息。

优势: 这种灵活性使得 JWT 很容易适应不同的应用需求,比如在访问控制中可以直接依据 JWT 中的角色信息做决策。

  • 安全性 JWT 可以使用对称或非对称加密算法进行签名,确保其内容不可篡改。JWT 的签名部分可以验证它的真实性和完整性。

    优势: 一旦签发,JWT 的内容无法被篡改,除非持有签名密钥或私钥。这提升了系统的安全性,特别是在不依赖会话的情况下。

    Cookie 的安全性较低,因为它容易受到会话劫持、XSS 和 CSRF 攻击,而 JWT 通过签名保护数据完整性,相对更安全。

8. get和post有什么区别

GET 请求用于从服务器获取数据,参数包含在 URL 中,适合读取操作,安全性较低;POST 请求用于向服务器发送数据,参数包含在请求体中,适合修改操作,更安全且适合传输大数据量。

特性GETPOST
用途从服务器获取数据向服务器发送数据
参数位置URL 中的查询字符串请求体 (Request Body) 中
数据长度受 URL 长度限制 (通常 2048 字符以内)没有明确长度限制,适合传输大数据
安全性安全性较低,参数在 URL 中易被截取和篡改相对安全,参数在请求体中不直接暴露
幂等性幂等 (多次请求不会改变资源状态)非幂等 (每次请求可能改变资源状态)
缓存通常会被浏览器缓存默认不缓存
对服务器的影响对服务器的副作用较小,通常用于查询操作对服务器可能有副作用,通常用于更新操作
编码类型application/x-www-form-urlencodedapplication/x-www-form-urlencodedmultipart/form-data

9. git commit 之后把代码删除能找回吗?git add之后呢?

  • git commit 之后:可以通过历史提交恢复已删除的代码。
//查看提交历史
git log
// **查找你想恢复的提交**,然后使用 `git checkout` 来恢复文件:
git checkout <commit_hash> -- <path_to_file>
// **将文件恢复到当前分支**:
git checkout -b temp-branch <commit_hash>
  • git add 之后:可以通过 git restore 恢复暂存区或工作目录中的文件。
// **查看暂存区的状态**:
git status
// **恢复暂存区的文件**:
git restore --staged <path_to_file>
//恢复工作目录中的文件
git restore <path_to_file>

10. 力扣796旋转字符串

可以通过将 A 连接到自己(即 A + A)来创建一个新的字符串,然后检查 B 是否是这个新字符串的子字符串。如果是,那么 B 可以通过旋转得到。

function rotateString(A, B) {
    // 长度不同,直接返回 false
    if (A.length !== B.length) return false;
    
    // 连接 A 到自己,检查 B 是否是其中的子字符串
    const doubledA = A + A;
    return doubledA.includes(B);
}

// 示例
console.log(rotateString("abcde", "cdeab")); // 输出: true
console.log(rotateString("abcde", "abced")); // 输出: false

总结

要不是408一上来就突突, 业务就和胡总一起拥抱在7平米的字节外景房了....

加油, 挥舞棒子......

转载自:https://juejin.cn/post/7409965146695024678
评论
请登录