粉丝62获赞97

目前呢是一二的一名学生,然后比较熟悉的编程语言是查瓦在校期间呢,和导师一起去承接的多个横向项目,呃,包括这个消息推送的融合平台,还有学校使用的这种在线派单系统。呃,同时呢,我在大三期间呢,还在上海纽库信息科技有限公司呢进行实习, 在实习期间呢最有挑战的一件事情就是对其中的订单系统进行了一定的优化啊,这个优化方案呢,包括呢是和底单一起去设计的这个分控分表的一些方案和迁移的方案啊。然后呢同时在订单的接口部分呢做了一定的优化,包括使用消息对联啊,然后呃呃,然后,然后对于订单状态流转的话呢,是引入了这个状态机的这种机制。以上就是我的一个基本的信息,谢谢 哦。嗯,好吧,这订单流转状态机呢大概说说是什么样的一个,呃最早的话呢,我们呃因为像这呃本身它这个平台呢是一个呃萨斯化的一种呃 erp 的 系统的平台,然后 针对这个订单状态的话呢,它是有很多呃很多种状态,比如说,呃刚开始是一个新建的状态,然后往里边加了这个物料,之后呢有可能是物料待生产的状态,或者呢是一个待审批待审核的状态,然后呃去去其中管理状态逻辑的地方也非常的多。 然后呢呃因为这部分呢比较混乱,所以我们最终呢是设计了一个状态机的一种方案,就是给订单状态呢加上呢呃加上一个美举,就是把所有的订单状态都先列出来,然后呢对外提供的是一个状态机的接受事件的一种机制,就是当我接收到对应的事件之后呢,才会对订单的状态进行流转。比如说呢,就是这个审核的状态初始的时候呢是一个新建的状态嘛, 审核通过的话它就是通过的状态,如果驳回的话就是一个驳回的状态。之前呢是直接在审核里边去修改一个订单的啊,就是直接同步的去修改订单的状态。现在的话呢是我们对外去暴露这个状态机的接口,然后让它去传入一个状态的事件,比如说审核通过,它传入的是审核通过的事件,然后我们在状态机内部呢再对订单的状态进行一定的修改,是这样一个逻辑, 嗯,了解。嗯,哦。然后 redis 实现分布式场景下订单状态一致性,这个大概是怎么做呢?这个还是刚才的这个逻辑嘛,就是, 呃,因为他有可能有两个这个邮件上就发生过这种情况,就是我一个状态,我一个订单新建完了之后呢,会通推送给审核节点去做审核,然后有一个审核人他通过了,另外一个审核人呢,他他他驳回了,然后,然后这个时候就会出现一个不一致的现象,第一个通过的那个人通过了之后一刷心发现,哎,怎么是驳回? 然后就会有这么一个一个一个情况,然后这里的话呢是呃,我们在接收到事件的时候呢,会对订单做一个分布式锁,只有拿到锁的才可以去修改这个订单。呃,这里边呢是用这个 radis 世界的分布式锁,然后主要呃场景的话呢,就是呃使用的是 set 呃 n x 和 e x 这两个后边两个辅助选项嘛? 然后他的 key 呢?是呃与订单 id 去生成的一个 key, 然后只有我成功的去 set 了这条值的时候,才可以去修改订单的状态,然后呢修改完毕之后呢去释放这个锁,那么另外一个状态,比如说我要从已审核去,呃,不是,我要从新建状态去新建,呃修改到已审核状态,那么他初试拿到的状态是新建审核状态, 然后这个时候来了另外一个驳回的,他初试拿到的状态是一个新建状态,那么他拿到锁之后呢?一查发现现在是通过的状态,然后他一刷新页面的时候,这个就是通过的一个状态, 是这么一个流程。嗯,你的放锁逻辑是在什么地方实现的?嗯,放锁逻辑是在呃真正去就是修改完订单之后,然后去呃,然后这个时候呢去检查一下呃这个锁的 owner 是 不是自己,然后是自己的话就把这个呃键去。对,把这个 key 删除了。 有没有可能说你在拿锁和放锁之间,然后你这个程序挂掉了,或者说嗯嗯发布新的程序,等会他停止了,嗯,呃这个一方面的话呢是如果说程序挂掉了,那我如果不做任何处理的话,那这个锁就没有人的释放了,然后这里边的话是引入这个状态过期的时间,就是 ex 这个指令,然后呃,然后在 ex 时间内没有过期的话,呃呃 不是,如果他挂掉了,但是超过过期时间的话呢,也会把这个锁去给它释放掉,然后呃另外的话呢?呃,大概是这么一个逻辑,但是这样的话呢? 呃最终,呃,因为这个就是因为当时系统里边已经部署了这个 radisson 的 这种,呃,这个这个键嘛。然后我是对,对于内部的原理呢,这块可能确实不是特别的深,但是我知道他可能有一个续期的一个一个机制,就是呃初时会建立一个过期时间,然后如果说检测这个业务还没有执行完的时候,会把这个过期时间进行一个续期,然后这样的话保证说 即使我到了过期时间,但是不会出现说我过期时间到了,然后业务没执行完,然后就把这个键给删除了这种情况。嗯,你们现在这个过期时间设置的是三十秒, 为什么是三十秒钟的时间长?嗯,这个认为的是我,我去修改一个订单的状态的话,其实是对订单表做一次修改嘛,认为这个三十秒的时间是相对合理的。当然这个是呃 leader 应该是做了一定的评估,然后当时我我去向他找到了他说这个权限,当时没有没有这个权限去看,然后他给了一个三十秒。是 哦, ok。 然后消息推送融合服务这个项目是在学校期间的,嗯,是,对,是一个横向项目的一个抽取嘛,因为在校期间呢,这个导师,我们导师主要是接这种横向的一些项目, 包括给这个中网和还有哈尔滨的哈铁集团去做一些呃,这种监控类的,或者是一体化平台的这种建设。然后在这个建设的时候呢,会有这种呃发消息的这种就是发邮件和发短信的这种需求, 同时呢我们的那个拆迁办理系统呢,也会发一些呃短信,或者说我们学校的哈工大 a p p 这种,呃 a p p 上面的一种推送。然后呃这样的话呢,我每一个项目都要去抽取一些,比如说发送短信的 s d k 发送邮件的这些东西都要去做对接嘛, 然后以及考虑到我们,呃现在加入实验室之后呢,都是用这种飞鼠去发送一些通知啊或者欢迎的信息,然后我们就把它呢抽取了一个项目出来,类似于中彩的一种设计,这是这个项目的一个背景,然后调研过一些市场上的话,我记得是有这种统一的,但是我们有一个核心的,就是我们要必须发这个卡顿 app 这种克制化的需求嘛,然后就只能是呃我们自己去实现一个从这个成本上去看上的话, 嗯嗯,这个做的一件事情就是做一个统一推送的一个,对对对对, ok, 那 它下游都有什么推送模式?嗯,我当时实现的是呃邮件和短信的推送模式,然后我还有一个同学和我一起做的,他是负责添加一些别的模式,呃,比如说这个,呃飞书的,钉钉的,呃 i m 的, 微信小程序的和航空 a p p 的 这些这些地方, 嗯嗯,呃邮件和微信,呃邮件和短信,对吧?对,这两个是怎么推送和下游?嗯,邮件的话呢是用了,呃这个具体的细节我记得是主要是查询了一些相关的资料,主要是一个 smtp 的 一个服务器地址, 比如说 qq 邮箱的话呢,是去呃把它打开那个 smtp 一个一个服务器,然后有一个密钥嘛,然后有一个发送者,然后去请求这个呃对应的 smtp 的 服务器去发送,然后短信的话呢,主要是对接的。呃,腾讯云、阿里云和一个到短信宝就是相对小的一个平台去做一个终端的一种处理,就是对接的这三个平台的短信发送的 sdk。 嗯, 比如说我们对外提供的是同一的 a p i 的 请求嘛?然后这个请求进来之后呢?呃,我们首先要做的第一层就是去构建一个消息,但是在构建整体的消息之前可能会做一些参数的校验,呃,包括呢会做一些模板上的呃模模板的校验,然后包括对其中一些敏感词进行一定的过滤,然后 这个环节呢以后还可能会再去增长。所以这里呢是用了一个责任链的模式,就是把刚刚就是整体来说的话呢,就是有一个统一的处理的一个链,呃责任链的头,然后会精简好好多个责任节点,然后每个责任节点呢来处理这个对应的上下文信息,还有一个指向下一个的节点,然后每个节点呢只会做其中的一件事情,比如第一个节点是一个飞空的一个脚印,然后第二个节点呢是做 呃消息模板的脚印,然后消息模板交接完毕之后呢,第三个会把他请求的内容去实际的放到消息模板里边的内容,这个里边包括一些占位符的替换, 或者是一些其他的东西。然后第四个呢是会对这个消息做一个整体的呃,就是敏感词的一个过滤,比如说呃就是发送一些什么呃中奖啊,或者是之类的这些东西,当然前提我们要去审核,然后最后一个呢是会构建成真正的康复感的消息,把它投递到呃消息的中转这个服务里,中转间里就是一个康复感。 这里边敏感词过滤是怎么做的?嗯,敏感词目前来说的话呢相对比较简单,因为我们只是用了自己的这个,因为我们现在的话呢只是用了糊涂,糊涂工具包里边的这个字典书,然后先把, 而且呃对,字典书就是先把这个敏感词呢去构建出一个书出来,然后去匹配说我们拿到的这个消,拿到的这个呃他发送的消息内容里边呢?有没有呃在这个敏感词的范围之内,如果有的话呢就把这个消息丢弃掉。 是个中文的字典书吗?对,是个中文的字典书,目前关键词的话呢就是一些,比如说什么黑客了,比如说什么营销了这种,就是呃学校里边然后会出现的一些词,这个主要是考虑到这个 app 上的这个请求。 ok, 然后消息驱虫是怎么做?呃消息驱虫呢是分了两个维度,第一个维度呢是一个用户他不会在五分钟之内去收到同样内容的一条消息。然后第二个维度呢是对于一个用户来说,对于他的一个短信来,呃一个渠道来说,比如说是短信,我会在二十四小时之内呢,不会超过某一个预置。 然后第一个的话呢是呃这两个都是用 radis 来实现的。第一个的话呢是呃把我会把这个接受方的这个,比如说手机来说就是一个 key, 然后呃在 radis 里边呢去设置这个 key 的, 呃过期时间,如果它配置的是五分钟,那么我们就把这个 key 设置成是五分钟过期,然后来了第一条消息的时候呢,发现,呃这个 key 没有数据嘛,那我就给它加到 reddit 里边,然后去做后续的发送过程来了。第二个之后呢,呃发现 reddit 里边已经有这条 key 了,并且这个 ttl 呢还不是零,它还没有过期,说明在五分钟之内发送过一条这样同样内容的消息,那么就把这条消息呢去丢弃。 然后第二个呢是呃同一个用户在同一个渠道之内一天不会超过,比如说也是五条消息吧?那这个呢是用了一个 zset, zset 来做的,这个 key 呢是一个业务的前缀,再加上,比如还是拿短信来说,就是一个手机号啊,再加上呃,再加上一个就是就呃再加上一个短信的前缀,其实有手机号和业务前缀就够了。 然后它里面具体存放的内容呢?一个是呃 score 嘛, score 就是 当前的时间戳,然后 emirates 呢,就是根据这个时间戳呢去呃找到了一个唯一的 k, 这里是用这个雪花,雪花算法去生成的,这个主要呢是为了避免说呃,如果说也是时间戳的话,那我呃同一时间发两条消息就会就会覆盖掉嘛,就只有一条记录了。 呃,然后我们在具体做的时候呢,是首先会呃把 z 三的 dream 八 a score 嘛,就是从零到呃当前时间点往前推二十四个小时,这个窗口之内的所有数据呢,都先删除,然后 z 卡的去看一下,说当前这个集合里边,呃, z 三的里边有多少条数据,如果没有超过我们的预值的话,它就可以发送,就可以往里去加,如果超过这个预值的话,就会把当前的这条信息去丢弃掉。呃,整体上来说是这么一个逻辑, 嗯,理解啊。 ok, ok。 下面还有一个 netflix 的 流量限制,这个跟刚才说的这个就是一回事,对,是一回事是吧?嗯,限制短时间内重复发送消息,限制单用户一天收到最大消息发送结束。对, ok, 这样点位收集到 最后一个是链路追踪是吧?对,是一个链路追踪,因为我们要考虑到说,呃,即使说我这个消息被驱虫了,但是,呃,但是我的上游的调,我们的这个客户他不知道是怎么回事呢?就是用户没有收到消息,然后这个时候呢去做一个日制的一个追踪,当然这部分的话呢,导致当时包括我们一起设想的架构是后续还会有大数据的同学一起来去做一个逻的一个处处理。 呃,这里的话只是,呃学习了这个 link, 然后把它写到 ready 里边去做一个统计,这先写进去,但是没有把它串起来,是因为后续是,呃,就是大数据那边去做的。 嗯,相当于自己做了一套链路追踪的机制,就自己在关键点里边埋,对,有一个埋点,然后呃,埋点之后呢,会都会放到卡布卡的一个主题里边,然后福林可能从卡布卡 sauce 里边去消费嘛,消费之后呢?去聚合,聚合之后写到 radis, 然后这些协议和逻辑都是自己设计的是吧?就包括埋的那种,对对对,聚合之类,对,为啥不用现成的链路追踪呢? 嗯,这块主要是第一方面来说的话呢,是我们想要一种更加克制化的一种需求嘛。然后第二点的话呢,就是可能这个中间的就是更加灵活一些,比如说我们这块的话,可能会有很多个这种丢弃的选项,就包括前期的一个,呃消息模板出错了,当然这是最基本的,然后或者说呢它是被敏感词过滤的 这种的。再或者我们呃发送成功,呃,这就不说了,包括在发送的时候呢,刚才还说了会有这种呃驱虫的一个处理吗?他是被哪个没哪个地方去驱虫的。然后再往后的话呢,还会有比如说我调用短信加油接口的时候呢,失败了,然后呃这个原因,然后会把这种多种的原因呢去做一个统计。我们主要是想说呢增加这个点控性, 为啥现场的这种模糊性这个东西满足不了你们的要求。呃,这个,呃,这个具体可能没没太了解这个地方。哦, ok。 然后看还有一个项目是线上判题系统,判题平台啊,这个系统呢?主要是,嗯,主要就是说呢,针对这个,呃我们的一些课程设计,比如说 c 语言、 java 这些这些东西,因为我们最早是有一个 sse, 就是 只是 c 语言的这个判 题系统嘛,然后里边的这个整体的流程呢,也比较比较古老了。然后当时导师和学校呢,就是除了这么一个需求,然后我们要去做一个线上的一个判题的系统,然后这是一个主要的功能, 嗯,就跟类似于用哪些做题软件是吧?对对对, ok, 然后 在前台页面上会有题目,对,会有做完都提交到后台去执行。对对对,这个大概是怎么做的呢啊?大概来说的话呢是就是前端这块呢,是另一个老师去设计的,主要负责的是后端这部分的一个设计。然后第一个是用户嘛,这个用户就呃就就就是基本的学生去拿学号和密码去登录,然后上来之后呢去做题, 然后提前呢管理员会在这个呃管理页面上去把题目,然后题目的描述还有题目的测试用力呢去配置好。然后学生去提交题目的时候呢,首先会进到这个呃判题的一个后台来,然后这个后台来说的话呢,它只是去做一个结偶的一个一个作用,它会把具体的数据呢去写到数据库里边,然后把这个呃写到数据库的 id 呢去发送到一个消息列表中。喂 喂喂, hello, hello, 刚才网卡了,好像是,嗯嗯,好。呃,然后就是再从刚才断开的地方开始,就是呃提交之后呢,首先会呃判定系统呢,会把它放到一个呃数据库中,然后会把这个数据库的 id 呢就放到一个消息队列当中, 然后后台的一个真正的去判题的一个执行引擎会从消息队列里面去提取,提取到之后呢会把呃学生提供的就是上传的代码,然后去做一个真正的执行。这块执行的话呢 也是有一个优化的一个逻辑,最开始的时候呢就是直接去用这个 process 类,就相当于是我们在呃命令行里边去调用了,因为最早我们只涉及的一种语言就是 java 这种语言,然后他在命令行里边要去 java 翻译一下,然后 java c 呢去 java c 翻译一下,然后 java 再去执行一下,去执行这个命令。 然后这样的话呢就会导致一些,比如说我要考虑到一些呃,就是呃就是就捣乱的这些操作嘛,比如说我要去打开一个文件,呃学生提交代码,打开一个文件,或者说去访问一个目录 这块的话呢,最早是这个权限设置呢,是通过这个也是刚才的自定义数去把这种敏感操作去过滤掉。但这个时候呢就会出现一个一个问题,就像那种呃最混乱代码的这种比赛或者怎么样,他会呃加一些编码或者两个词汇拼一下,就就就就就就绕过了, 然后这种方式呢就不太合理。后来呢我们是加入了这个,呃加我安全管理器吧,叫 security manager, 然后他呢可以去对执行的代码去做一个,比如说不允许他读文件,不允许写文件,然后把网络关闭这种情况, 然后这是这个这个过程。但是这个时候呢还会有一个问题,就是他可能会偶尔一直去往里边留对象,然后呃我们在参数里面呢去加入了这个最大的内存以及一些其他的一些参数去限制。然后后来的话呢就是呃后来就是我们觉得这种方式其实本质上还是 还是会有漏洞,所以后来呢是用的这个 docker, 是 用 docker 去提供的这个 java 的 呃 api, 然后去创建一个容器,然后在容器内部呢去执行,那在容器执行的时候呢,也是关闭网络,关闭文件读写的这种需求。然后在呃, docker 提前打开的时候呢,会配置它最大的使用的这个内存量和最多的一个超时的时间数,然后这样的话也更方便,能够统计说它最终消耗了实际多少多大的内存,然后用多少的时间, 然后再和我们预设的这个限制去做一个对比,看它到底是不是 a c 了,就这么一个逻辑,嗯,怎么比对最后的结果是否正确?嗯,这里的话就是提前在体库里边会设置一些对应的这个判题,测试用力和对应的一个结果。 然后在运行程序的时候呢,就会把在命令行里面去把这些判题的用力去传进去,然后拿到一个结果之后呢去和结果机去对比,其实这里的话有一个判题用力就会去执行一次这个程序。 嗯,这个输入输出是怎么传递的?嗯,输入输出呢?是通过,呃,就是命令行这块嘛。然后最早的时候呢?就是,呃,最早的时候呢,因为它那个 java 的 process 类里面它是有这么一个,呃,能够获取它最终运行结果的这么一个一个 a p i, 然后主要是调个 a p i, 然后去执行完了之后去获得这个最终的结果。 呃,我问一下你要求就是输入的这个代码,嗯,它是一个函数还是一个?它是一个 acm 的 可值型的一个,不是核心代码,因为我们直接进去之后给它定义了要求它是直接可定义的,就是说它要提提供一个完整的这种。对对对对,如果说现在要做成一个 核心的这个函数的这种提交方式的话,你要怎么改你这个系统?嗯,如果要做成核心提交函数的话,那可能就是我要去把其他的运行环境去 去。呃,就是把其他的,比如说这个运行的主函数,然后以及对应的一些,呃,其他的对应的方法去整理好,然后对于只只是去调用它这个函数的逻辑,也就是说我要去把非核心函数之外的可运行的环境去搭建好,然后在核心函数,然后在主函数内的话呢去调用。呃,就是我们要提前给他去设置好这个核心方法的签名嘛, 然后就调用这个方法的姓名去得到它的一个输出,然后通过这个输出呢再去比对。相当于是一个翻译的过程。是在刀块内部进行的还是在外边进行?嗯,翻译的过程是把它打成一个炸包,然后直接扔,然后直接构建刀块镜像的时候给它扔进去, 有时候在外边进行,对,在外边进行,那如果说他翻译失败了,那些翻译错误就怎么吐回去?嗯,翻译错误的话就是在数据库的数据库里边会有一个记录,就是刚才的状态呢,是一个未判题的一个状态,或者说判题中那个状态, 然后如果编辑失败的话,会把这个状态改成就是编辑失败的一个状态,然后前端在轮询的时候呢,就会把它这道题的状态是编辑失败给它返回。哦,但是你不能返回说编辑失败的一些告诉对吧?嗯,对,目前目前没做这个,只是告诉他编辑失败的。嗯, ok, 好 的。这两个项目就是消息推送、融合服务和线上跨体平台,相当于都是实验室老师承接的一些项目,对吧?对,这个, 呃,线上判题平台的话呢,目前由于学校政策的一些调整,就是上线了两周,然后后来,后来说不用了,不知道,可能是要考虑第三方或者是什么东西,这个目前来说是下线了。然后上面那个在线不是消息推送的融合服务呢?我是一直在用,因为老师的公司里边现在发短信也也都用这个接口了。嗯, ok, 好 的,好。哎,在我们这个会议的界面上有一个页面有个答题 出题能能看得到吗?嗯,可以看到,然后我在这编辑一下。嗯,这边能不能能够看到? 嗯,这边能看到。嗯,能看到。嗯。我写的比较草率,就是我解释一下这个题目的含义,嗯,我们先看这个一,就是大的那个数字一,嗯嗯,然后给了两个 case, 嗯,解释一下这个题目哈。这个是说我们会给定一个数组,嗯, 然后这个数组呢?它会有一个规律,就是这里面的数字有一个数字出现一次,嗯,然后其他的数字出现两次。比如说上面那个 case 一, 嗯,啊,它会有一一二三三二,就是出现一次的那个数字一和三都出现了两次。嗯,但是并不会保证说像 case 一 这么理想, 他出现两次的数字都出现在一起,嗯嗯,绝大多数的情况可能像 case 二,就是他会打散了。嗯,但是不违背刚才提到的那个规律。嗯,他还是一二三一三,一出现两次,三出现两次,但是不挨着二出现一次。嗯, 啊,然后这个题目是比较常规哈,先拿这个题目做一个影子,就让你找出那个只出现一次的那个只出现一次的数字。那我对, 嗯,想一想能不能直接直接直接给他加一个减一个?加一个减一个加一个减一个。好像好像不行。那我如果计数计数这个普打都有点高,普打都有点高,那我怎么去把它就变成零呢?出现一次给它对撞,给它整成零,哎, 是不是?哎?等会啊,是不是能忆过一下?想想啊?可以。嗯如果我忆过一下那两个相同就整成零,整成零了之后 然后零啊?不零还可以接着一或接着一或和二的话,那想想啊,如果他俩不同,如果他俩相同是零,不同是一整成零之后和他一或,那得到的就是那就可以去我拿一个零去顺着他去一或一圈下来。就是因为相同的重复出现两次都会变成零吗?那出现一次的就是, 呃就就就是最后最后这个结果呢?就是他只会出现一次的这个这个这个结果。嗯这个其实是一道很常见的题,就拿疑惑来做,这个是我们其中的一个解法啊,如果不让你来疑惑来做的话还有其他的方式呢?呃如果不疑惑的话那就是说我要去把它。呃 如果,其实它,嗯这个数据的就是数据的范围,有有要求吗? 你说的数据范围就是他里边每一个元素的一个范围,比如说我的,呃元素是比如说我这个数长度是 n 下标零到 n 减一,然后这个内部元素的范围没有没有啊。那或者如果有的话你会怎么做啊?如果有的话,那其实,呃,其实我可以就是他相当于是每一个数据都会有一个对应的位置吗? 呃,比如说我的范围就是一到 n, 那 其实对于其中每一个出现的出现的元素呢?它都会有一个对应的位置,然后我去便利它对应的这个元素,然后找到它所对应的位置。比如说一这个元素对应的就是零号下标,然后发现第一个的时候呢,它已经到这个下标上了,然后第二个再来一个一的话,然后它对应的也是零号下标嘛, 对应的也是零下标的话,那零下标里边那个位置的元素就应该去置零,就说明一已经出现了两次,然后二这个元素呢会重新放在这个一这个位置上来啊。但其实如果没有的话,我是我可以用 mac 来做,比如说我把一,那我就加到这个哈希 mac 或者 saf 里边去,然后再来一个一的话呢,我发现它里边有了,那我就把这个值移除, 如果没有的话就给它加进去来了一个二。比如说拿这个 case 二来说呢,就是一二三先加进去,然后发现 sum 里边是有一的,那我把一去移除,然后 sum 里边是有三的,我把三去移除,最后剩下一个元素就是要的那一个。嗯,你会用什么数字结构来管理这些中间信息呢?嗯,会用一个哈希曼或者哈希萨特,就是去记录一下它有没有出现过 这个数据结构。我们大概介绍一下,就是它主要就是一个列表加哈希表的一种实线嘛,初时呢有一个大小,然后对于每一个 k 进来的时候呢,会通过这个 k 的 哈希值再做一定的扰动,就是尽量让这个哈希去分布的均匀一些,然后再去除模语这个整个哈希的疏堵的长度,然后找到它所要存放的一个下表, 然后找到这个下标之后如果是公就加进去,如果不是公呢,就去变利,变利他后边那个链表,如果冲突的话就是给他拿一条链表连起来,然后如果变利链表的时候呢,发现了这个哈西是一样的,然后再比较。呃, echo 就是 他俩到底是不是同一个对象,如果是的话,如果是同一个 key 的 话,就把这个弯里给它覆盖掉,那如果不是的话,就是一直变利到结尾了,变到结尾再给他加进去, 那它会随着元素一直放的越加越多吗?嗯嗯,结构上会有一些变化调整啊。呃,这个因为还是要去保证这个。呃,尽量来说的话呢,如果它最后极端情况就会串成一条链嘛,串成一条链这种就变就变成链表了,就不太好了。 所以它会有一个就是扩容的一个机制,这个扩容呢就是回设了一个负值因子,默认是这个零点七五吧,然后零点七五去乘以。呃,比如说数值开始是十六个槽位,就是十六个数组,那就是十二个,达到十二的时候呢,就会去扩容扩成两倍,当然它这个数组长度的话呢,保证是二的一个密字吧,因为这样的话我对于扩容的一个数值来讲,它要么在当前这个位置,要么在 当前这个位置,再加上原数组长度这个位置,这样就可以把它去分散过去,去把这个电绑长度呢,这样去缩短, ok 啊。然后刚才提到的这个大的数字,一是我们引入的一个问题,然后其实我们想去重点聊的是第二个那个问题,嗯,我们看一下下面那个数字的那个 case, 嗯啊,其实你会发现这个 case 和我们的刚才的那个问题的第一个 case 是 一样的,嗯,是吧?嗯。一二三三。嗯, 然后第二个问题实际上也跟第一个问题的高度相关,是在第一个问题的基础上增加了一个限制条件,嗯,就是我会约定凡是出现两次的数字一定会同时出现。嗯 嗯,会加一个这个约束。嗯嗯。然后那加了这个限定条件之后,之前的那个问题的所有的解法在当前这个问题上依然都是用,对吧?对,包括你的疑惑,或者说你用一些中间的数据结构去管理。嗯, 那既然加了这个条件,我就直接引导一下,就是我会期待你用更好的办法去解决这个问题。嗯嗯,你看一下这个问题,就在加了这个条件之后,你有没有一些新的思路可以实现更好的这个接法。嗯, 呃,如果是我其实可以这个第一次变利的时候,我去变利下一个下标嘛,就是比如说我来到零,我会去比较,因为它是挨着的,所以我会去比较零和一的。这个 啊,这里应该得考虑一个说是从基数去变离还是从,因为如果二啊,也不会因为都是挨着的,都是挨着的,那就是两个一组去看。两个一组去看嘛,然后找到第一个,就是我先找一,然后一的下一个也是一,说明一出现了两次,然后我就直接跳到下标是二的位置,就第三个数,然后第三个数到二了,然后他的下一个数呢?不是二,说明就是就是他, 就是他这会出现问题。嗯嗯,其实也就是说,呃,那如果这样的话呢?如果,如果这样的话,那其实偶数位的这个数据 再稍等一下。我想讲下边的话,呃,偶数位的数据和基数位的数据是相等的,那就不会有问题, 然后我要找的是偶数位的数据和基数位数据不等的这个偶数位数据,然后这的话呢会出现一个情况,就是如果我,如果我正常来说的话,我去均分之后,他是一个偶数位数据,他下一个应该是和他相等的,但是如果前面出现了一个不等的,那么后面这个基偶性变化就会出现问题,所以我可以去找这个基偶性变化 出现问题的这个这个点,那所以,嗯,这块是不是可以二分一下?就是我先去找终点,然后看终点,他是属于终点的上一个数和下一个数相不相等,那如果终点的这个数和上一个数不相等,和下一个数也不相等,那就那就是他自己。 如果终点的数和下一个数是相等的,然后终点还是一个偶数,那就说明前边的都是两个一组去出现的,两个一组去出现,所以它会在后半部分再出现。如果终点的这个数和偶数位相等,那那就应该在终点之前去出现了这个,呃出现一个数字的这种情况, 这样的话我去二分的去查找,这样时间复杂,就是落个 n 吧。嗯,把这个方法大致写一下,行。嗯嗯。

你好,纽护国际美加欧墨海运的来,您要不要了解一下?您现在主要做哪个平台?我现在主要是在做外贸,做外贸我们会有那个商资地址的服务的。 你这是货代是吧?对,我们偏向电商货代多一点。哦,我们是就是突突逼的可能会多一点,你们是在坂田是吧?对,我们在坂田那边,我准备要合作的话,因为我们之前合作过一些货代,他价钱跟一开始说的就不一样,包括处理问题的话,他可能会说什么有,有什么文件费啊,各种费用,但是之前都没有这样的, 我们想合作的话就是大家讲诚信一点,就比如说我,我这个我们一开始谈多少钱,然后就是多少钱。如果是比如说遇到海关查验或者各方面各方面,如果是遇到问题你该怎么解决?对,就是包括就是你们的延误率大概是多少?就这个的话,可能 我觉得我还想要一个真实的答案,因为之前我们有合作过,也是大型的播带公司,有没有出现过这种问题?好,我给您按照三点回复一下,第一点是延误率的问题,我们准答率说,第一有自己内部的一个数据,到时候可以发给您。第二个是说各种附加费的问题, 我们到时候会发给你一份完整的报价表,我们会签合同是不对,我们会有一个完整的合同,不管是赔付时效啊、超时这些东西都是按照合同来进行的, 不会中间再告诉我有各种的什么费用,那些费用我们会在一开始报价时候就跟您讲清楚,您的货量是这么多,跟您撤价之后我们有一个系统输出一份合同,这份合同就是按照您标价多少, 您到时候打款也是打到我们系统就打这么多,那费工的付款。对,然后刚刚第三点就是说 b to b 的 问题, b to b 的 话,我们现在是用一个商司的服务,我们那边有自己的海外仓, 您直接把货发到我们仓库,我们发到我们海外仓再给您做出去。你们就是说包括你们整个整一个整个报,呃,就是报关呐,这些的什么海关这些对接都是你们在对,是不是?对,您把需要的资料提供给我们,然后我们帮您全部搞定,对,需要什么你会告诉我。发给您的话所有的这些清官呐, 反正所有的报税你们全部都管,是不是?对,我们全部都管?如果您想要自己去清官,报官也没问题。我没时间,没时间的话我们有 ddp 的 到门服务,全部帮您搞定,你只需要提供资料就可以了,如果有什么缺的资料的话及时联系你补齐 可以,可以。对,好好好,那我们先逛吧,我们先逛一下时间比较长时间。好的好的,祝你们再聊,祝你们逛点顺利。好,您客气。

fba 的 意思不是说亚马逊物流, fba 的 意思是送货到亚马逊仓库的物流,亚马逊有一个自己的物流体系,我们相当于他的第三方程序商,这样的定位亚马逊物流会更贵。嗯,时效肯定是更稳定,因为它属于官方,我们相对来说更便宜,时效也稳定。嗯, 而且我们用的船也是像以新和德这一类的船。 fba 不是 亚马逊仓库,是发到亚马逊仓库。对,这个 a 是 m, 这是亚马逊。我们公司在哪?神州电脑大厦,坂田贝尔路,在深圳的是吧?对,就在深圳, 离这里大概是一个半小时。有机会上来和我们这位女生喝喝茶,我们投尾诚都坐。我们是尾诚起家,自行卡车队的。 就是从国内送到亚马逊叫头程。头程是指从国内你的那个发货地址从你的供应商那里送到船,叫头程。你可以把这一段分为三段,头程,中段尾程,这叫集装箱越过船弦,责任移交给船公司, 船公司的责任就在海上漂,这段时间我们货代干涉不了,我总不能催船开快点,下船那一瞬间就开始进入清官环节的时候,这部分就属于尾程。尾程我们叫做清皮派 头绳,叫做揽集运,尾绳就是指尾端的清官提货,把柜子从港口提出来派到亚马逊仓库。头绳现在基本上就不赚钱,因为像报关费传公司的一条仓的价格,这些行业都已经很透明了。

蔡总,您好,我是纽库国际物流这边的,我看到您在亚马逊那边有做一款开放垃圾桶,不知道您现在的物流服务还满意吗?挺满意是吧?这样,你们现在走的是哪一家公司?方便透露吗? 合作两家是他们的价格打动您,还是他们的服务打动您呢?各方面都有,那您比如说拓展业务需求的话,有没有需要再多一个备选项呢?两家完全够用是吗?那要不这样,就比如说您现在,对啊,跑路, 其实我这么跟您说,因为我们这家公司体量真的是比较大,您可以上网搜一下,这我明白,但是我还是跟您再说一句,虽然不管市面上怎么说,但是我们直接上豆包搜,我们都能搜的到他排出来就能排到我们, 我们资质什么的相信你也看过很多,资质,我们就不跟您多说,如果你走的是美西餐,肯定会看到有一个 send 服务商对吗?好多人都在 send 里面,我们算其中一家了。您平常会用 send 服务吗? 用不了 send 是 吗? send, send 也太贵了。哦,这样,那平常您比如说 o n t 八这样的价格大概是多少哦?你们是送到哪里呢?美东,美东那边的话我们也有一个价格标的,那就是您现在主要是那个仓库要放在哪里呢?就是在哪收货比较方便呢?您的货的话 郑州,郑州那边的话我们有一个仓的呀,纽库国际。哦,我听明白了,其实就是对方的服务非常满意,他的价格可能反倒还在第二个层次,他们就就近直接,就方便您联系,也方便您管你的货物,这样的话丢货什么情况都很少发生。 其实像您刚刚说这种情况呢,跟我们几乎是很匹配的,我们有一句标语叫做稳定交付旋钮户,如果有丢货的情况,我们肯定会第一时间跟进。那肯定您是卖家吗?我们是服务商,我们服务商就是为您做服务的吧。 那要不这样,就是您有机会的话先加我个微信,然后呢,如果您后续真的是有需要的话可以联系我。当然您后续真的是有需要的话可以联系我。当然您后续真的是有需要的话可以联系我。当然您后续真的是有需要的话可以联系我。当然您后续真的是有需要的话,可以是如果他们说 有些货接不了,也可以看一下我们能不能接,或者我们价格有没有优势,你看这样怎么样?好,明白明白,毕竟是的,我看到您在那个排行榜上面排的也比较高嘛,这样也是很正常的。 哈哈,好的好的,明白。那我现在先加您这边微信,你有空的时候通过一下吧。好,谢谢,好好,再见。