Python技术迷

飞书,裁员1000人。。。

最近,我在网上逛的时候,看到一条消息——“飞书”,居然开始裁员了。更有网友直接发帖:“互联网果然是卸磨杀驴,飞书成型了就开始裁员了。”

Image

评论区的网友们也是纷纷响应。有人挺赞同这种看法的:“那必须的,磨好了面粉,为啥还要让驴子继续跑?那面粉是老板的,可不是给驴子吃的。驴子还是那个驴子,可老板早不是当初那个磨面的老板了。”

Image

也有人调侃道:“这不是叫你们平时多写点防御性的代码嘛。”哈哈,这笑话可并不好笑。

Image

另一位网友则是有些无奈:“几千人弄个用户寥寥的产品,能撑到现在,也就靠着字节跳动财大气粗了。”

Image

还有网友就很直接了:“飞书裁员一点都不意外吧?只不过是哪天裁不确定而已。”

Image

评论区一通看下来,大多数都觉得飞书人太多、不好用、不盈利,加之大环境也不好,所以并不意外。反而觉得这么久了才爆发,字节是真有钱啊。

Image

但是,其实也是能理解,大几千人做出来的东西却没多少人用,搁谁谁不急啊。就不难理解飞书大规模减负了,虽然这很残酷。那么你们怎么看呢?

下面是今日的大厂算法题
今日算法题,来自LeetCode的第35题:搜索插入位置,下面是我的算法思路及实现,让我们来看看吧。
算法题目

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

专属福利 
👉点击领取:最全Python资料合集
算法思路

二分查找算法的核心是每次查找都将搜索范围缩小为原来的一半,直到找到目标值或搜索范围为空。对于本题,我们可以稍微修改二分查找的逻辑,以定位目标值的插入位置:

  1. 初始化两个指针,left = 0 和 right = nums.length - 1。

  2. 当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 的位置,即第一个大于目标值的元素位置。

  • 代码实现
    Java实现
    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)-1    for left <= right {        mid := (left + right) / 2        if 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。

    总结
    通过这个问题的解决,我们可以看到二分查找不仅能用于查找操作,还能在查找失败时提供有价值的信息,比如元素应插入的位置。
    Image
     1
    Image
    热门推荐
    Image