飞书,裁员1000人。。。
评论区的网友们也是纷纷响应。有人挺赞同这种看法的:“那必须的,磨好了面粉,为啥还要让驴子继续跑?那面粉是老板的,可不是给驴子吃的。驴子还是那个驴子,可老板早不是当初那个磨面的老板了。”
也有人调侃道:“这不是叫你们平时多写点防御性的代码嘛。”哈哈,这笑话可并不好笑。
另一位网友则是有些无奈:“几千人弄个用户寥寥的产品,能撑到现在,也就靠着字节跳动财大气粗了。”
还有网友就很直接了:“飞书裁员一点都不意外吧?只不过是哪天裁不确定而已。”
评论区一通看下来,大多数都觉得飞书人太多、不好用、不盈利,加之大环境也不好,所以并不意外。反而觉得这么久了才爆发,字节是真有钱啊。
但是,其实也是能理解,大几千人做出来的东西却没多少人用,搁谁谁不急啊。就不难理解飞书大规模减负了,虽然这很残酷。那么你们怎么看呢?
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
专属福利 👉点击领取:最全Python资料合集
二分查找算法的核心是每次查找都将搜索范围缩小为原来的一半,直到找到目标值或搜索范围为空。对于本题,我们可以稍微修改二分查找的逻辑,以定位目标值的插入位置:
初始化两个指针,left = 0 和 right = nums.length - 1。
当left <= right时,执行循环:
计算中间位置 mid = left + (right - left) / 2。
如果 nums[mid] 等于 target,直接返回 mid,表示找到了目标值的位置。
如果 nums[mid] 小于 target,说明目标值在 mid 右侧,将 left 更新为 mid + 1。
否则,nums[mid] 大于 target,说明目标值在 mid 左侧,将 right 更新为 mid - 1。
如果循环结束还没有找到目标值,此时 left 将指向目标值应该插入的位置。因为循环结束时,left 总是指向最后一次比较中 mid + 1 的位置,即第一个大于目标值的元素位置。
public int searchInsert(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return left;}
JavaScript实现
function searchInsert(nums, target) {let left = 0, right = nums.length - 1;while (left <= right) {const mid = Math.floor((left + right) / 2);if (nums[mid] === target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return left;}
Go实现
func searchInsert(nums []int, target int) int {left, right := 0, len(nums)-1for left <= right {mid := (left + right) / 2if nums[mid] == target {return mid} else if nums[mid] < target {left = mid + 1} else {right = mid - 1}}return left}
算法解析
对于数组 nums = [1,3,5,6] 和目标值 target = 5,返回 2。
对于数组 nums = [1,3,5,6] 和目标值 target = 2,返回 1。
对于数组 nums = [1,3,5,6] 和目标值 target = 7,返回 4。
对于数组 nums = [1,3,5,6] 和目标值 target = 0,返回 0。
热门推荐