字节飞书后端三面凉经

没怎么问八股,出了三个题。
一,用redis实现分布式锁。(伪代码)
二,手写接口限流算法,避免大量请求导致服务器瘫痪。(伪代码)
三,给一个数n,在给一个数组,这个数组里的数都是个位数,用这个数组里的数构造出小于n的最大整数。

————————————————————————————————
更新:4.14 收到感谢信
#字节跳动面经##面经##字节跳动##后端开发#
全部评论
前两个伪代码是项目相关吗
1 回复 分享
发布于 2022-04-13 20:32
https://paste.nugine.xyz/ueybl3oq/ 随便写了点测试例子,有问题欢迎指正。
1 回复 分享
发布于 2022-04-14 18:45
限流 按照某一段时间内允许多少请求 固定窗口 滑动窗口 令牌桶 漏斗
1 回复 分享
发布于 2022-04-22 08:28
第三题思路能说一下吗
点赞 回复 分享
发布于 2022-04-13 22:05
这么难吗,楼主base哪里
点赞 回复 分享
发布于 2022-04-14 16:49
记数字n的长度为M, 给定的可选数字中最大的为Mx,数字n为abcdef..., 首先可以取长度为M-1且每一位为Mx的数。接着从高到低枚举, 第一位能填1~a,我们要么填a,要么填小于a的最大值,因为如果选了小于a的可选最大值,那么后面的位置没有任何限制,所以此时答案为:长度为M,且首位为小于a的可选最大值,后面M-1位为Mx。如果可选数组没有a,直接结束;否则第一位选a,考虑第二位.....,如果我们顺利考虑到了第M位,那么前M - 1位一定是选了abcdef.... ,此时判断下小于最后一位的可选最大数是什么就行了,因为我们要保证选出来的数小.于n. 时间复杂度为log_10{n},空间复杂度为O(1). 思路不一定正确, 欢迎指正.
点赞 回复 分享
发布于 2022-04-14 17:01
老哥,看你这么久了,有点眼熟了,现在有什么结果不
点赞 回复 分享
发布于 2022-04-15 16:14
https://leetcode-cn.com/problems/numbers-at-most-n-given-digit-set/ 这个题的变形吧
点赞 回复 分享
发布于 2022-04-16 17:25
private ArrayList<integer> num = new ArrayList<>(); private int max = 0; private int[] result; // 存储选择的每一个数 private final int[][] contain = new int[10][2]; // 存在与否 小于自己的第一个数的索引 public int maxNum(int n, int[] arr){ if (arr == null || arr.length == 0) return 0; Arrays.sort(arr); // O(1) int tmp = n; // 计算n的长度 while (tmp != 0){ // O(N) num.add(tmp % 10); tmp /= 10; } // 维护hash数组 for (int i : arr) { // O(1) contain[i][0]++; } // 维护hash数组最小链 O(1) int small = -1; for (int i = 0; i < contain.length; i++) { contain[i][1] = small; if (contain[i][0] != 0){ small = i; } } result = new int[num.size()]; int head = num.get(num.size() - 1); // 分情况处理 1. 最高位存在,则进行dfs 2. 最高位不存在但是存在一个比它小的值(2500 不存在2但是有1) // 3. 剩余位填充数组里的最大值即可 if (contain[head][0] != 0){ if(dfs(0,arr,n)) return max; }else if (contain[head][1] != -1){ max = contain[head][1]; } for (int i = 0; i < num.size() - 1; i++) { max = max * 10 + arr[arr.length - 1]; } // 提供的数字都大于n最高位,只能返回n-1位长度 return max; } private boolean dfs(int depth, int[] arr, int n){ if (depth == num.size()){ return arrToInt() < n; } // 如果前一位已经小于模式数了,剩下的直接选择最大值比如(4 5 00与4 4 99) if (depth > 0 && result[depth - 1] < num.get(num.size() - depth)){ while (depth < num.size()){ result[depth++] = arr[arr.length - 1]; } return true; } // 到此说明前一位仍是选择了相同的数,dfs不可能选择大于的,因为这样得到的数必然大于n int cur = num.get(num.size() - 1 - depth); // 存在则选择,不存在选更小的 cur = contain[cur][0] != 0 ? cur : contain[cur][1]; while (cur != -1) { result[depth] = cur; if (dfs(depth + 1,arr,n)) return true; cur = contain[cur][1]; } return false; } private int arrToInt(){ int sum = 0; for (int j : result) { sum = sum * 10 + j; } return sum; }</integer>
点赞 回复 分享
发布于 2022-04-19 20:53
三面完几天收到感谢信?
点赞 回复 分享
发布于 2022-04-30 20:52
几年经验?
点赞 回复 分享
发布于 2022-06-09 13:01

相关推荐

不愿透露姓名的神秘牛友
11-21 19:05
点赞 评论 收藏
分享
8 80 评论
分享
牛客网
牛客企业服务