只有前端崩盘?后端和测试还行?网友:都一样~
闲来无事,我在网上网上冲浪的时候,就撇到一个的帖子,是一网友的提问:目前好像只有前端崩盘了,后端和测试好像行情还行耶。一看到这个,我心里咯噔一下,相信大家和我心里一样,都咯噔了一下吧。
帖子下面,果不其然网友们都炸了。有人直接反驳说:“测试岗位一个位置能有几百人投简历,你还觉得行情好?”这话一出,我直接麻了。
另一边,还有人开玩笑:“后端确实没崩,直接无了”这玩笑可不经开啊。
还有人打算转行:“后端没戏了,我都打算转行做前端去了。”这是从虎口跳进狼窝吗。
更有人直言:“我们失业的同事里,就数前端找不到工作。”这话听着,前端哭兮兮。
但也有人淡定:“一个行业的兴衰,不存在独善其身。不过是看谁炸得更惨而已。”更惨了好吧。
看完这一番讨论,我不禁感慨,一个行业的兴衰,确实不存在独善其身,要凉一起凉。而我们能做的,不论是转行,还是继续内卷,都要保持心中有光,砥砺前行。
下面是今日的大厂算法题
今日算法题,来自LeetCode的第33题:搜索旋转排序数组,下面是我的算法思路及实现,让我们来看看吧。
算法题目
给你一个整数数组 nums,数组中的值互不相同。在传递给你之前,nums 在预先未知的某个下标上进行了旋转(例如,[0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。
请你根据这个数组和一个目标值 target,返回目标值存在的下标。如果不存在,则返回 -1。你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。
专属福利 👉点击领取:最全Python资料合集
本问题可以通过二分查找算法来高效解决。算法的关键在于判断旋转的分界点,以及在每次迭代中确定目标值可能存在的区间。具体步骤如下:
初始化左右指针 left = 0 和 right = nums.length - 1。
进行二分查找,计算中间点 mid = left + (right - left) / 2。
判断 nums[mid] 是否等于 target,如果等于,直接返回 mid。
通过比较nums[left]和nums[mid]的值,判断左侧是否是有序的:
如果左侧有序,判断 target 是否在左侧范围内,如果是,移动 right 指针到 mid - 1;否则,移动 left 指针到 mid + 1。
如果左侧不有序,那么右侧必定有序。判断 target 是否在右侧范围内,如果是,移动 left 指针到 mid + 1;否则,移动 right 指针到 mid - 1。
如果找不到目标值,返回 -1。
func search(nums []int, target int) int {left, right := 0, len(nums)-1for left <= right {mid := left + (right-left)/2if 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。
搜索旋转排序数组问题通过对二分查找算法的巧妙应用,展示了如何在部分有序的数组中高效查找元素。
热门推荐