Python技术迷

只有前端崩盘?后端和测试还行?网友:都一样~

闲来无事,我在网上网上冲浪的时候,就撇到一个的帖子,是一网友的提问:目前好像只有前端崩盘了,后端和测试好像行情还行耶。一看到这个,我心里咯噔一下,相信大家和我心里一样,都咯噔了一下吧。

Image

帖子下面,果不其然网友们都炸了。有人直接反驳说:“测试岗位一个位置能有几百人投简历,你还觉得行情好?”这话一出,我直接麻了。

Image

另一边,还有人开玩笑:“后端确实没崩,直接无了”这玩笑可不经开啊。

Image

还有人打算转行:“后端没戏了,我都打算转行做前端去了。”这是从虎口跳进狼窝吗。

Image

更有人直言:“我们失业的同事里,就数前端找不到工作。”这话听着,前端哭兮兮。

Image

但也有人淡定:“一个行业的兴衰,不存在独善其身。不过是看谁炸得更惨而已。”更惨了好吧。

Image

看完这一番讨论,我不禁感慨,一个行业的兴衰,确实不存在独善其身,要凉一起凉。而我们能做的,不论是转行,还是继续内卷,都要保持心中有光,砥砺前行。

下面是今日的大厂算法题

今日算法题,来自LeetCode的第33题:搜索旋转排序数组,下面是我的算法思路及实现,让我们来看看吧。

算法题目

给你一个整数数组 nums,数组中的值互不相同。在传递给你之前,nums 在预先未知的某个下标上进行了旋转(例如,[0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。

请你根据这个数组和一个目标值 target,返回目标值存在的下标。如果不存在,则返回 -1。你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

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

本问题可以通过二分查找算法来高效解决。算法的关键在于判断旋转的分界点,以及在每次迭代中确定目标值可能存在的区间。具体步骤如下:

  1. 初始化左右指针 left = 0 和 right = nums.length - 1。

  2. 进行二分查找,计算中间点 mid = left + (right - left) / 2。

  3. 判断 nums[mid] 是否等于 target,如果等于,直接返回 mid。

  4. 通过比较nums[left]和nums[mid]的值,判断左侧是否是有序的:

  • 如果左侧有序,判断 target 是否在左侧范围内,如果是,移动 right 指针到 mid - 1;否则,移动 left 指针到 mid + 1。

  • 如果左侧不有序,那么右侧必定有序。判断 target 是否在右侧范围内,如果是,移动 left 指针到 mid + 1;否则,移动 right 指针到 mid - 1。

  • 如果找不到目标值,返回 -1。

  • 代码实现
    Go语言实现
    func search(nums []int, target int) int {    left, right := 0, len(nums)-1    for left <= right {        mid := left + (right-left)/2        if nums[mid] == target {            return mid        }        if nums[left] <= nums[mid] { // 左侧有序            if target >= nums[left] && target < nums[mid] {                right = mid - 1            } else {                left = mid + 1            }        } else { // 右侧有序            if target > nums[mid] && target <= nums[right] {                left = mid + 1            } else {                right = mid - 1            }        }    }    return -1}

    Java实现

    public int search(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;        }        if (nums[left] <= nums[mid]) { // 左侧有序            if (target >= nums[left] && target < nums[mid]) {                right = mid - 1;            } else {                left = mid + 1;            }        } else { // 右侧有序            if (target > nums[mid] && target <= nums[right]) {                left = mid + 1;            } else {                right = mid - 1;            }        }    }    return -1;}

    JavaScript实现

    function search(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;        }        if (nums[left] <= nums[mid]) { // 左侧有序            if (target >= nums[left] && target < nums[mid]) {                right = mid - 1;            } else {                left = mid + 1;            }        } else { // 右侧有序            if (target > nums[mid] && target <= nums[right]) {                left = mid + 1;            } else {                right = mid - 1;            }        }    }    return -1;}

    算法解析

    本算法的核心在于通过二分查找,每次迭代都能排除一半的搜索区间。由于数组是部分有序的,关键在于判断当前的搜索区间是在旋转点的左侧还是右侧,以及目标值是否在当前的有序区间内。这种方法能够确保算法的时间复杂度为 O(log n),其中 n 是数组的长度。

    示例和测试

    对于数组 nums = [4,5,6,7,0,1,2] 和目标值 target = 0:

    • 第一次迭代时,中间值为 7,由于左侧 [4,5,6,7] 是有序的且 0 不在此区间内,因此搜索区间变为 [0,1,2]。

    • 第二次迭代时,中间值为 1,此时右侧是有序的且 0 在此区间内,因此搜索区间变为 [0]。

    • 第三次迭代时,中间值为 0,匹配成功,返回下标 4。
    总结

    搜索旋转排序数组问题通过对二分查找算法的巧妙应用,展示了如何在部分有序的数组中高效查找元素。

    Image
     1
    Image
    热门推荐

    Image