2023.11.7(二面代码题有点难度...)

1,883 阅读4分钟

MiniMax 一面

  1. 自我介绍
  2. 简单介绍一下你们成立了这个finance的财务中台之后,整体的服务架构是怎么样的吗
  3. 就你提到的预算池项目,展开说说背景,以及解决了怎么样的问题
  4. 为什么采用针对T-1订单的异步计算方案,而不是在线链路实时计算每一单的金额,技术方案这么设计是出于什么考虑
  5. 不同渠道适配多履约模式项目中提到的付费模式抽象建模,能具体讲讲吗
  6. 改动涉及下单核心链路,前向兼容是怎么处理的
  7. OpenAPI网关的架构是怎样的,主要是起到什么样的作用
  8. 你们这个是怎么针对不同三方去做协议的转换,是代码里写死吗?(把不同的参数映射成标准的参数,是有定制化的代码吗)
  9. 代码题(思维,逻辑,边界条件)
双数组求第k小

题目描述

给定两个有序数组,均为从小到大排序,求在两个数组中第k小的元素的值


例如

a = 【13579b =【246810】

返回第5小的数字,为6

参考答案(golang实现)

func FindKthSmallest(a []int, b []int, k int) int {
   lenA := len(a)
   lenB := len(b)
   // 边界处理
   if k <= 0 || k > lenA+lenB {
      return -1
   }
   // 使用双指针遍历
   p1, p2 := 0, 0
   // 找到第k个数,只需要循环k-1次,因为起始位置已经指向了第一个数,因为第k个数只需要向后再移动k-1次
   for i := k; i > 1; i-- {
      if p1 == lenA { // 如果数组a已经遍历完了,直接在数组b中找第k小的元素
         return b[p2+i-1]
      }
      if p2 == lenB { // 如果数组b已经遍历完了,直接在数组a中找第k小的元素
         return a[p1+i-1]
      }
      // 比较当前a[p1]b[p2]位置上的元素大小,较小的元素指针向后移动一步
      if a[p1] < b[p2] {
         p1++
      } else {
         p2++
      }
   }
   return minInt(a[p1], b[p2])
}

func minInt(a, b int) int {
   if a < b {
      return a
   } else {
      return b
   }
}

2023.11.20 二面(交叉面,一面是上海的面试官,二面是北京的面试官)

  1. 自我介绍
  2. 看新的机会的原因,为什么不选择等到明年年初才跳槽
  3. 介绍项目,希望你能从以下方面展开阐述:当时的背景、你在该项目中的角色和定位、技术选型、碰到的技术难题、成果及项目产出、个人得到哪些成长
  4. 预算池目前管理的资金池规模多大
  5. 你觉得这里头的复杂点在哪里,或者说你做的过程遇到的困难的链路是哪部分?
  6. 你觉得哪一块对你的技术挑战是最大的
  7. 自己对你的一面有什么评价吗
  8. 代码题
题目描述
输入m, n 输出一个m行n列的蛇形矩阵,
m n 的取值范围均为[2,10], 2<=m,n<=10

示例:
输入
m=3, n=4
输出
1 2 6  7
3 5 8  11
4 9 10 12
  1. 反问

代码题思路

蛇形矩阵思路.png

参考答案(golang实现)

func PrintMatrix(m, n int) [][]int {
   fmt.Println("input m,n = ", m, n)
   // 先初始化一个零值二维矩阵,后续往里头填充实际值
   res := make([][]int, m)
   for i := 0; i < m; i++ {
      res[i] = make([]int, n)
   }
   // m*n的矩阵总共有m+n-1条斜对角线,逐条打印
   cursor := 1
   for i := 0; i < m+n-1; i++ {
      //fmt.Println("i: ", i)
      // 偶数序号(i=0,2,4...)的对角线,是从左下到右上递增的, 填充值的顺序按下标(x,y) x是递增(列数递增),y是递减(行数递减)
      if i%2 == 0 {
         for k := 0; k < i+1; k++ { // 第i条斜对角线上至多包含i+1个数
            if k > (n-1) || (i-k) > (m-1) { // 超出矩阵索引边界的就过滤掉
               continue
            }
            res[i-k][k] = cursor
            cursor++
         }
      } else { // 奇数序号(i=1,3,5...)的对角线,是从左下到右上递减的,填充值的顺序按下标(x,y) x是递减(列数递减),y是递增(行数递增)
         for k := 0; k < i+1; k++ {
            if k > (m-1) || (i-k) > (n-1) { // 超出矩阵索引边界的就过滤掉
               continue
            }
            res[k][i-k] = cursor
            cursor++
         }
      }
   }
   // 打印结果
   for i := 0; i < len(res); i++ {
      fmt.Println(res[i])
   }
   return res
}