八奈见 level
获赞
1054
粉丝
213
关注
232
看过 TA
8239
蚌埠坦克学院
2025
golang
IP属地:上海
快来找我内tui(๑>ڡ<)☆
私信
关注
2024-09-24 12:28
蚌埠坦克学院 golang
Cyber丁真:还真就是这样,后面发现是个数学题,得O(logN)才能过😅
投递深圳虾皮信息科技有限公司等公司10个岗位
0 点赞 评论 收藏
分享
2024-09-08 17:07
蚌埠坦克学院 golang
牛客48531675...:第一题前缀和或者dp,第二题求一个最大子区间(前缀和后最大(当前值减去当前出现最小值)得到区间和),然后每次这个子区间和翻倍,加上其他,坑在于中间取模(80%思考一下,如果全都是负值,10000多个负值最后能不能保证取模拿到正数模)我是(答案+mod*100000)%mod。第四天写一个最大因数判断dcq来解决互斥判断,地图上1代表互斥,0代表没问题,然后判断几个区间里没有1。这个判断依旧可以前缀和二维前缀和记录每个点到(0.0)点一共多少个1,从而通过右下角+左上角-左下角-右上角得到一个区间中有没有1值。时间复杂度(nmlogk)复杂度体现在求出互斥。
投递拼多多集团-PDD等公司10个岗位
0 点赞 评论 收藏
分享
2024-09-07 18:40
蚌埠坦克学院 golang
Crueyl:dp 4种情况,消除首尾,消除后两个,消除前两个,然后中间切分求和,不考虑最后一个的话只能过27
投递滴滴等公司10个岗位
0 点赞 评论 收藏
分享
2024-08-31 23:00
蚌埠坦克学院 golang
协程一直来说概念上挺玄学的,个人觉得确实是属于网上误传也非常多一种概念,经常跟用户级线程、绿色线程各种概念混在一起了。很多时候都说是一个东西,很多时候又能说出区别。留一个自己认知的大概解就差不多了,关键落到会用,跟线程的对比上有足够认知就差不多了。要提到这些概念也没问题,面试别咬死了说就好(我目前感觉这三个确实是一个东西)。● 不管定义是怎样,一定正确的一些特点:○ 协作式,非抢占式,编程语言决定或者协程自己决定如何做切换调度○ 完全用户态,无内核开销,大多数操作不涉及系统调用● 跟线程对比○ 实现特点:线程是 os 的软中断实现的,内核决定主要调度,协程一般是自己让渡,很多时候是线程复用,无传统意义上的中断。○ 控制难度:这个是我之前没留意的一个点,感觉协程线程其实用起来都差不多。但协程确实提供了很多机制来降低控制难度,线程需要百分百管理锁和同步,而协程一般都会在语言运行时层面上进一步做抽象来简化并发模型。比如 go 里边的 wg 和 channel。○ 性能:更轻量实现并发。上下文切换、用户态、占用内存(栈空间)goroutine 是协程在 go 语言里的‘实现’(我觉得实现这种说法比是在 go 里面的‘优化’更好一点,因为协程本身就没有一个确定基础实现。所以其实就我目前的理解协程更像是满足上面特点的一种‘不同于多线程的程序并发实现思想’)● 基本认知○ 和线程 m 对 n 关系,可以并行○ 基于 GMP 模型,模型可以认知为整体的一个实现,其中 P 是作为调度器的角色,gm 分别代表 goroutine 和 内核线程的抽象。○ 几种调度方式:一种分类是主动、被动、正常、抢占四种情况。这个分类挺好的,列举了所有情况。主动是还没执行完交出执行权,被动是临时阻塞被调度器给调度了,正常调度是结束调度新的,抢占调度是后面版本引入的针对系统调用僵直情况的调度。前面三种都是协作式的符合协程特点。● 怎样做调度,大概的调度流程和机制,剩下有哪些调度细节○ gmp 模型中,p 主要是本地队列,m 主要是线程抽象,直接指向 g。执行设想就是,p 动态绑定一个 m,然后 m 再通过 p 去拿 g 去执行。○ m 怎么找到下一个正常执行的 g:主要按照本地队列、全局队列、wait 队列、work-stealing 的顺序取(再加上一个每 61 次会优先全局防止饥饿)○ g 的生命周期,正常流程 idle -> dead -> runnable -> running -> dead,运行的两状态会分别进入一个系统调用状态和 wait 状态(即阻塞,就是上面的 wait 队列,由被动调度触发)○ 我们直接创建的 g 优先进入当前 p 的本地队列,本地队列满或者主动让渡等情况会进全局队列● 其他面试问题○ 调度器 P 起到了什么作用?试想没有 P,那么我们 g 直接跟 m 绑定,那么好像其实就跟直接跟使用线程差不多了只是简单封装。首先最明显的作用就是实现了一个 m:n 关系,p 虽然跟处理器没直接关系但是还是确实代表一个抽象,最佳实践就是 p = 核心数(GOMAXPROCS),一定程度上线程的数量。其次这样动态绑定实现了线程的复用。除了这两个设计上的作用,剩下的就是他作为本地队列了,就类似于一个 channel 无锁化的重要步骤。最后还有 p 是作为一个所谓的“万能中间层”,除了动态做这种绑定复用,还能处理僵直的抢占调度的情况,这种情况下 p 会重新绑定一个 m 再去执行 g。■ 有个进阶题目,在一个 GOMAXPROCS 不等于核心数的 container 中运行程序会怎样?简单说,p 的数量直接意味着整个调度系统认为我们 cpu 有多少核,最大并行能力是怎样的。如果多了的话,就是实际线程数可能会比最佳值要大。那么就是调度效率下降,资源竞争加剧,性能下降。少了基本就是没充分利用了。○ 如何实现无锁化的。调度的时候取 g 的顺序,只有全局要加锁,p 是空的时候和窃取失败的时候都会提前取好 g。○ 为什么轻量?用户态,弱内核依赖,上下文切换,栈动态扩缩(初始内存是 0)○ 操作系统如何向某个Goroutine发送时钟中断呢?(这个我暂时没找到答案,目前理解是 os 先通知 go runtime,然后相关 m 在自己执行过程中被插入系统调用。)○ goroutine 终止会对其他 goroutine 产生影响吗(已捕获可恢复可以,否则会因为传递到顶层 g 导致全部崩溃)○ 什么时候被回收(这个问题有点奇怪,了解所有调度方式就好了,正常用完都会被回收,不然就是 panic 恢复,程序结束)
0 点赞 评论 收藏
分享
2024-08-31 20:40
蚌埠坦克学院 golang
offerSuL:无环图感觉是408的表达式?(我猜的),文法是编译原理
投递美团等公司10个岗位
0 点赞 评论 收藏
分享
2024-08-31 15:24
蚌埠坦克学院 golang
0 点赞 评论 收藏
分享
2024-08-30 21:05
蚌埠坦克学院 golang
能接触到的常见问法:项目中有用到什么设计模式?(前端更多点)重构使用了什么设计模式?(如果你项目强调了重构一般会问)说说对 XX 模式的理解?(个人接触过的是单例和工厂,这两个比较多)有接触到哪些?实际用到过哪些?(通用)除了这些,还有一些不常见的进阶和基础问法,这些直接在下面整理--设计模式这个主题还挺玄乎的,个人直观体验是,自己日常实习那段时间问得挺频繁的,可能是因为没啥好问的。找暑期实习的时候就问的少了。可能设计模式的定位还真是,个人体验也是,没有大量实践注定没有深刻的理解,对校招生的要求不会那么高吧。所以我感觉一般策略还是要强调,能想到什么说什么,展示自己对设计模式有一个基本理解,有刻意去考虑使用设计模式这种感受。作为面试 fw 就不多说了,这里就自己能想到什么就整理什么呢。参考价值不大,可能更多的还是要结合自己项目。--OOP 有哪些设计原则?如何理解?(这个可能 cpp 问的比较多,go 倒是不常问)● 封装。定义是我们通过向对象传递消息来直接执行方法,隐藏方法细节,而不是面向过程那样直接展示方法。这个基础上扩展,才有了私有方法变量这种进一步的封装。● 继承。继承就是字面继承一个类是属性方法,实现复用和多态。● 多态(比较常问),定义是对象在不同条件在统一接口下有不同的行为。go 主要通过接口实现,java 和 cpp 也都是分解通过继承和接口/虚函数实现。○ cpp 函数重载是一种「编译时多态」,不太符合传统理念上的多态。○ 策略模式的设计模式,同一对象在不同环境下使用不同算法,就是一种常见的多态设计。比如 orm 框架适配多种存储策略,cpp 排序 stl 适配多种排序算法。如何理解设计模式和设计原则?● 区别简单来说,设计原则是一些比较抽象的知道原则和方向,设计模式则是一些具体的时间。● 设计模式分为创建型、结构型、行为型三种。● 五大设计原则 SOLID:○ 单一职责:一个类只负责一个功能,具体一般也扩展到一个模块只负责一类功能,一个函数只负责一件事情。○ 开闭:对扩展开放,对修改关闭。这个一旦沾了企业开发确实就接触的挺多,说到这个想起我上段实习就是上去就把代码给重构了被臭骂了一顿。总之这个的意思简单说现有的代码不应该乱改,影响稳定影响线上功能要回归测试。好的做法是,有接口留够扩展性在那(这个需要之前设计的人有实力),你的想做的新的需求应该是在现有的基础上去做扩展。还有一个常见的例子是,假设你有一个新需求,你现在有一个线上接口可以通过加参数来实现,这种情况更好的做法是另起一个新接口,因为你改改逻辑就顶天了,改函数签名影响可能就比预想的要大很多了。○ 里氏替换:子类必须能替换父类,保持行为不变。这个 go 里边用不到。覆写不违反 lsp 原则,只要不改变预期行为。○ 接口隔离:客户端不应该知道他不知道的功能。在 go 里面能考虑的地方还挺多的。首先接口设计上,接口要尽量小,去发现接口而不是事先创造接口。其次,go 里面接口独特的机制是隐式实现,所以双端同时使用接口不会有循环依赖问题,所以我们常见的一种实现是服务端负责完整抽象,客户端单独做他的部分抽象。这个就是经常说的,在 go 里面“避免完成生产侧的接口”○ 依赖倒置:定义是上层不应该依赖下层,而都应该依赖抽象。抽象不依赖细节,细节以应该依赖抽象。设计目的是为了创造耦合性低的依赖关系,所以 DIP 往简单了说就是解耦。此外控制反转,IoC,一种具体实现 DIP 的设计模式,不手动控制对象把控制权交给容器或者框架,其实反面例子就是面向过程的手动控制对象的创建、行动相关操作。依赖注入DI,一个具体的行为,也可以说 IoC 的实现方法之一但是不只是在 ioc 里面用到,就是把对象直接作为参数传入另一个流程的一个写法而已,例子有很多,比如 vue 里边就可以注入全局变量来解决深参数传递的问题。● 五原则回顾,开闭和依赖倒置比较常问。这两个是有点像的,不过区别也很明显,虽然都可以借助接口实现,不过一个目的是扩展一个目的是为了解耦。常用的几个设计模式?● 工厂:一些定义和典型实现是,专门用一个工厂类来封装创建对象的逻辑,类的创建延迟到子类。好处是封装、低耦合(创建的逻辑是独立的内聚的)、便于扩展(要增加新的创建方法的话,直接替换掉原来的工厂方法调用就好了)。● 单例:目的是全局就是只能只应该唯一实例,否则并发问题或者管理混乱。例子像是 logger,confger,连接池,cache。然后恶汉懒汉 doublecheck 确保能单例实例化。你 go 项目里会用到设计模式?(Java 废物,Java 那块的 aop,ddd 就不整理了)不多说,直接提供例子,这种一般你没实际写过,能答出来面试官也不会感兴趣,所以其实一些过于抽象的模式,像是代理、桥接也就不必说了● NewXXX()是一种简单工厂模式● sync.Once()实现单例● 注册模式:实现全局 init 对象到一个 map 里● 责任链模式,我们不管请求最后会怎么样,没法解决的问题往下传,“丢锅”:gin 的中间件机制。● WithOption、可变参数、函数闭包 实现 选项模式 https://goplay.tools/snippet/xpnL6BhCsJa● 建造者模式就是比方我们用个 resty类似的 http 库,来发一个请求 setHeader● 策略模式比较常见,interface 多种算法实现都是策略模式,比方说多种灰度方案限流方案数据库连接方案偶见的设计原则开放性场景题:假如有一个历史包袱很重的项目丢给你重构,你会考虑到哪些设计原则和设计模式?(这个很考验积累了,我能做到的只能是分享这个问题和目前的浅见解了,欢迎探讨)● 没话说就是上面的原则逐个说一遍就好了● 肯定要强调的是模块化,高内聚低耦合,原因能想到的也围绕一些常用的点说:可维护性、复用性、扩展性、稳定性、简单性。有点八股性质了,具体还是看经验结合例子说。不过能想到这些角度感觉也是有意义的。--卡着实习 ddl 昨天实在没写完,精力管理确实重要。决策消耗心智大概到极限了,优化空间在于把实习的事情看得更轻一点,都打算跑了根本不用在意那么多。不过实际做起来还是很难协调,实操性大一点的地方还是在于尽量把排期铺开,分不出时间就延期。中断一天,重新开始#每天一篇简单博客 day2-1(个人打卡,欢迎监督
查看8道真题和解析
0 点赞 评论 收藏
分享
2024-08-29 09:51
蚌埠坦克学院 golang
RestFul 与 RPC 的区别是什么?RestFul 的优点在哪里?这个问题的话,确实被问过,但是不是很频繁。主动展示自己熟悉 http 规范可能比较容易引出来,不然一般就是结合 RPC 问了。不会很加分,还是防备式的一种问题--区别● 设计目的上○ RPC 是为了在分布式系统上不同机器的函数调用隐藏细节就像本地函数调用一样○  RESTful API,一种架构规范,设计目的就是为了规范管理网络通信(把网络通信定义成对资源的操作 )● 定义上○ 个人暂时理解 restful 就是在正常使用 http 协议基础上的一个规范, rest 这个词表现层状态转换,表现层的定义就是客户端服务端的中间层。目前理解也没什么特殊含义,最终其实都是围绕「一个 http 请求一定是对资源的某种操作」这个核心设计来的;○ rpc,远程过程调用。http 可以作为一种实现,你也可以在 tcp 上去自定义对字节流做相关的编解码处理。现有框架如 grpc 都选择了 http (http2) 作为应用层实现是为了保证兼容性,毕竟你要客户端同时实现编解码规则还是非常麻烦的。● 主要特征○ rest 无状态(其实我感觉,虽然 mdn 说 http 是无状态但是可以通过 cookie 保持一种会话,还不如说 rest 是无状态的),rpc 可以方便的在调用间改变状态。rest 无状态是说每个请求是独立的可以任意 顺序执行,就算你是 post 单次执行也都是独立的。rpc 可能每次调用就是相关联的一组函数了,甚至你几次执行还要加上分布式事务。○ rest 主要基于 http 方法,这样简单的规则对资源进行操作。rpc 则一般更灵活,可以实现更复杂的操作。虽然说 http 理论上也可以 handler 执行任何过程,但是那不是 rest 的设计目的,反而是应该避免的,这些都算是副作用。● 使用场景○ rpc 更快性能更高,一般用长连接做维持,也不用 json 做编解码。能满足高性能、实时性、强类型要求的场景。○ rpc 常用于服务间相互调用,也是因为内部方便规范;rest 适用于前端客户端往服务端请求,或者对外服务。优点● 首先个人感觉上,restful 在接口特别多的时候优势比较明显。○ 他是一种规范一种整理,比较常见的反例就是接口 url 直接使用行为代替,比如 POST /updateTweet? Id={id}对比 PUT /tweets/{id}。○ 实践中,如果有大量接口,那么遵守 rest 规范天生就是一种整理。资源目录就是一种分类,@ 才能表示行动,路径参数直接能定位到某个对象的所有资源,同样的路径不同的 HTTP 方法表示不同的意义... 这些都是一种让人很畅快的「整理手段」。● restful 更容易被缓存。● 服务端负担更轻。--参考● https://aws.amazon.com/cn/compare/the-difference-between-rpc-and-rest● https://aws.amazon.com/cn/what-is/restful-api● http 无状态的定义是两次请求执行成功互不影响 https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview#basic_aspects_of_http不过感觉里边很多点目前还是理解不了,上面的整理还是非常有限。所以还是有问题请指出来--今天更水了,实习的事情被卡死了,真想跑了#每天一篇简单博客 day3 (个人打卡,欢迎监督
0 点赞 评论 收藏
分享
2024-08-27 23:50
蚌埠坦克学院 golang
地址栏输入 URL 回车后的过程中,详细展开说下 dns tcp http 协议使用的过程。这篇个人感觉整理得一般,要是刷到了不建议阅读,觉得角度不错可以自己看后面参考和小林重做整理--DNS 解析:● 浏览器缓存 chrome://net-internals/#dns -> hosts文件 gethostbyname库函数-> DNS Server● server 一般显示 本地子网 arp 查询,然后去 isp 查 dns 缓存dns 解析之后,下面进入浏览器内核代码的网络编程部分● 这个时候还没有 http 参与,我们需要事先建立好连接● 调用 socket 相关系统函数,创建客户端 socket● 建立连接的请求直接由 tcp packet 提供信息,往下分别通过网络层,链路层等流程,然后通过某种网络环境,经过路由器进行网络传输在如上的循环中进行 TCP 三次握手(四次挥手也是)● 客户端初始化 isn,设置 syn 位作为第一次 tcp packet 的内容发送● 服务端收到,ack 域设置 isn+1 表示收到。然后同样设置 syn 初始化 isn● 客户端同样设置 ack 位并且 ack 域设置 server isn + 1● (后面确保可靠传输的流程就是把 ack 的数字 编程 + byte 数)如果说,我们在 url 解析阶段(不是 dns 解析)得到的端口是 443,那么我们开始进行 tls 握手● 相互 hello:确定套件算法版本等,主要交换客户端随机数和服务端证书。(一般不做客户端验证,这个是服务端网络编程部分决定的)● 客户端响应:生成第二个客户端随机数 pre master,证书公钥加密传输。并包含 Finish 消息便于做摘要验证○ 根据本机信任 ca 列表验证服务端证书○ premaster + 客户端第一个随机数 + 服务端随机数 = 生成 = 会话密钥○ 验证原理是所有内容先做 sha 摘要下来,然后加上密钥 输入 prf 伪随机数函数得到「验证消息」,客户端通过相同方案来看验证消息是否正确● 服务端响应:同样做摘要得到验证消息○ 同上生成会话密钥,密钥不直接做交换。http● 服务器端通过 「http deamon 程序」来处理 http 请求,一般是 nginx apache 或者编程语言 web 框架了。往后一般离用户态比较近了,比较常接触,可定义性也比较强。不过也有有些常见的操作。● nginx 常见操作:url 重写、负载均衡、虚拟主机● web 框架常见操作:○ http 整个消息拆分成几个主要部分,关键就是方法,路径○ 然后路由处理、过中间件等(待扩展,一时半会我也想不起来有哪些了。--因为感觉这个题目,个人平常都答得太简单了,其实这确实是个引出来常见其他计网面试题的好过程,整理一下主要想串起来其次也是后面就能占据主动了。参考 https://github.com/skyline75489/what-happens-when-zh_CN ,有不对请指出--#每天一篇简单博客 day2 (个人打卡,欢迎监督今天比较水了,不过坚持最重要
0 点赞 评论 收藏
分享

创作者周榜

更多
关注他的用户也关注了:
牛客网
牛客网在线编程
牛客网题解
牛客企业服务