微信 一面

  1. self-intro 1min
  2. 项目 5min
  3. 你这实习有突破啥技术上的难点嘛(无)
  4. faas
  5. hnsw
  6. 八股 30min
  7. os
  8. sigpipe
  9. 解释线程安全
  10. c++
  11. std::vector和std::map是线程安全的吗 NO
  12. map读/写/遍历的时间复杂度
  13. kafka
  14. 底层原理
  15. kafka的副本数是怎么确定的
  16. kafka需要同步所有副本才能确定同步完成吗
  17. raft
  18. raft论文看过吗
  19. raft中挂了一个节点怎么选举leader
  20. net
  21. EAGAIN是什么
  22. read()时出现EAGAIN,为什么
  23. send()时出现EAGAIN,为什么
  24. 用udp写过项目吗
  25. 做题 50min
  26. 手写atoi()
  27. 合并有序链表
  28. 给定rand()函数可随机生成0~65535,需要从30w人中随机抽出10w人(id: 1~300000)给出随机选出的id(有无大佬会的,请教一下)
  29. 按时间戳无序大数组统计login/logout,小内存,统计最大在线人数
  30. 最长子数组问题(双指针)

全部评论
举一个简化的例子:如果rand()函数返回一个0到15的数,我们需要一个0到100的范围。我们可以生成两个这样的随机数a和b,然后计算n=a*16+b。这会给我们一个0到255的数。然后,我们执行n%101得到一个0到100的数。注意,这样做有很小的偏差,因为256不是101的整倍数。然而,生成一个0到300000的随机数,相对于65536,偏差非常小,可以忽略不计。
点赞 回复
分享
发布于 04-25 23:03 北京
要避免由于取模导致的不均匀性,我们可以使用舍弃法(rejection sampling)。基本思想是,我们继续生成随机数,直到这个数落在一个我们可以均匀处理的范围内。具体来说,作为示例,我们生成一个大于或等于0且小于等于N * 300000 - 1的随机数,其中N是可以使得N * 300000刚好小于等于最大可能生成的随机数的整数。
点赞 回复
分享
发布于 04-25 23:04 北京
联想
校招火热招聘中
官网直投
C++标准库中的容器如std::vector, std::list, std::map等本身不是线程安全的。这意味着在多线程程序中如果有多个线程对同一个容器同时进行写操作或者同时进行读写操作,那么需要开发者自行通过互斥锁(如std::mutex)或其他同步机制来保证线程安全。
点赞 回复
分享
发布于 04-25 23:05 北京
线程安全(Thread Safety)是一个编程概念,在多线程的环境下,如果一个程序或者数据结构可以被多个线程同时访问而不引发任何类型的错误或者问题,那么它就是线程安全的。 具体来说,线程安全的代码可以同时被多个线程安全地调用而不用担心外部的同步。为了做到这一点,线程安全的代码需要确保共享资源在同一时间只能由一个线程访问(例如通过互斥锁),或者设计成无论多少线程访问它们也不会导致错误的状态(例如无锁编程技术或者简单地不共享数据)。
点赞 回复
分享
发布于 04-25 23:07 北京
在C++中,标准库提供的 std::map 通常是以红黑树实现的平衡二叉搜索树。下面是对std::map中一些常用操作的时间复杂度概述: 查找元素(读操作): 时间复杂度为 O(log n),其中 n 是 map 中元素的数量。 插入元素(写操作): 时间复杂度同样为 O(log n),这是因为需要先找到正确的插入位置,然后可能还需要进行红黑树的平衡调整。 删除元素: 时间复杂度也是 O(log n),删除操作涉及到查找要删除的节点以及后续的可能平衡操作。 遍历整个map: 遍历 map 的时间复杂度是 O(n),因为你需要访问 map 中的每个元素。即使它是基于树的结构,完整的遍历仍然意味着访问所有节点。
点赞 回复
分享
发布于 04-25 23:09 北京
`SIGPIPE` 是在 Unix 类操作系统中存在的一个信号,其信号值通常为 `13`。当一个进程向一个没有读取端的管道(pipe)或者 socket 写入数据时,操作系统会发送 `SIGPIPE` 信号给该进程。 通常情况发生在如下两种场景: 1. **管道(Pipe)**:如果你创建了一个管道,一个进程写入数据,而另一个进程负责从管道中读取数据。如果读取的进程结束了执行,管道的读端就会关闭,此时若写入进程继续往管道写数据,写入进程会收到 `SIGPIPE` 信号。 2. **套接字(Socket)**:类似地,在网络编程中,如果一个进程向一个 socket 写入数据,而对应的远程连接已经关闭了,导致没有读取数据的地方,那么写入操作会引发 `SIGPIPE` 信号。 默认情况下,当进程收到 `SIGPIPE` 信号时,会导致进程异常终止。然而,可以通过编程来处理这个信号,避免默认的行为,例如可以: - 忽略 `SIGPIPE` 信号,这样写入操作会返回错误,而不是终止进程。在 Linux 中,可以使用 `signal(SIGPIPE, SIG_IGN);` 或者设置 socket 选项 `SO_NOSIGPIPE` 来忽略它。 - 捕捉 `SIGPIPE` 信号并通过一个自定义的处理器函数来处理它。 - 使用 `send` 函数向 socket 写数据时加上 `MSG_NOSIGNAL` 标志,这样操作系统就不会发送 `SIGPIPE` 信号,而是返回 `EPIPE` 错误。 在编写网络应用或者使用管道来进行进程间通信时,合理处理 `SIGPIPE` 信号非常重要,可以提高程序的健壮性和可靠性。
点赞 回复
分享
发布于 04-25 23:12 北京
`EAGAIN` 是 Unix 和类 Unix 操作系统中的一个错误码,代表 "Resource temporarily unavailable"(资源暂时不可用)。在涉及非阻塞操作的系统调用中,`EAGAIN` 通常被用来告诉你,操作在现在无法进行,但是在未来可能会成功。 当调用 `read()` 或 `send()` 或其他 I/O 函数时,在非阻塞模式下,可能会出现 `EAGAIN` 错误。 `read()` 时出现 `EAGAIN` 的原因: 当你在非阻塞的文件描述符上执行 `read()` 操作时,如果没有数据可供读取,而且调用该操作的进程不会被放入等待状态直到数据到达,这时操作系统会立即返回 `EAGAIN` 错误。这是告诉你,现在没有数据可读,但是你可以稍后重试。 例如,对一个非阻塞的 socket 或管道执行 `read()` 操作,如果接收缓冲区为空,那么 `read()` 调用将失败,并返回 `EAGAIN`。 `send()` 时出现 `EAGAIN` 的原因: 类似地,在非阻塞的 socket 上执行 `send()` 操作时,如果发送缓冲区已满,不能接受更多的数据,操作系统同样会返回 `EAGAIN` 错误。在这种情况下,可以等待一段时间直到缓冲区中的数据被对端读取出去一部分,释放出足够的空间后再次尝试发送。 处理 `EAGAIN` 错误的典型方法是使用 I/O 多路复用机制(如 select, poll, epoll 等)来监控文件描述符的状态,进而知道何时可以进行非阻塞读或写。在可读或可写时再次尝试对应的操作。如果你在应用程序中不希望处理 `EAGAIN` 错误,另一个解决方案是不使用非阻塞模式,或者对 `EAGAIN` 返回进行适当的重试逻辑处理。
点赞 回复
分享
发布于 04-25 23:18 北京
洗牌算法
点赞 回复
分享
发布于 04-26 10:59 北京
我跟你问的差不多
点赞 回复
分享
发布于 04-28 10:03 北京

相关推荐

1 2 评论
分享
牛客网
牛客企业服务