海康威视 应用开发岗 笔试
- 轮次
- 笔试
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 单选题 30 道,每题 2 分,考的都是偏基础的细节。
- 不定项选择题 10 道,每题 3 分。
- 编程题一:给一个字符串数组(子串),要求拼出一个给定的字符串,每个子串可以使用多次,问最少需要多少次(完全背包问题)。
- 编程题二:给定一个 Order 类,需要设计两个组件。一是参数校验器,把输入的参数与订单号生成规则做校验,成功则传参返回一个 Order 类;二是订单号生成器,订单号包含年月日数字、五位顺序号、用户 id,其中五位顺序号每天刷新一次,范围 00001 到 99999。
《参考解析》
- 字符串拼接的最少次数:这是完全背包求「最少硬币数」的变体——把目标串的下标当成背包容量,每个能匹配上的子串是一次可以重复取的物品,价值固定为 1,求填满的最小次数。实现上 dp[i] 表示拼出前 i 个字符的最少次数,dp[0]=0,其余初始化为无穷大,枚举每个位置和每个子串做前缀匹配后转移:dp[i+len] = min(dp[i+len], dp[i]+1),能匹配的位置枚举顺序无所谓,因为是完全背包所以内层正序。注意先判断每个子串匹配时是否越界,以及拼不出来时返回什么。
- 订单号生成器的并发与刷新:五位顺序号每天重置,说明它是按天局部的序列,不能用一个全局自增计数器。单机内可以用 AtomicInteger 加一个当天标识,发现日期变化就重置并回绕;多实例部署就要把序列放到 Redis 里,用 INCR 加当天 key 和过期时间,超过 99999 要明确是报错还是滚动。另外日期要取服务器统一时区,否则跨零点会出现重号,生成后建议落唯一索引兜底。
- 参数校验器怎么设计:校验分两层——字段级用注解或规则表做非空、长度、格式、枚举检查;业务级校验订单号是否符合生成规则,并识别调用方传的是「已有订单号」还是需要生成的请求。返回 Order 对象意味着校验通过后要完成字段填充,所以把解析、校验、组装拆成三步,校验失败抛带错误码的异常而不是返回 null,避免调用方漏判。这段代码的考点其实在职责划分和可扩展性,不在于写得短。