拼多多今年社招一面试题!

算法学习网址:wansuanfa.com (玩算法的拼音)

这题是LeetCode的第33题,难度为中等,应该说不算难,一网友在今年拼多多的社招面试中遇到这题,除了拼多多考这道题以外,我们看到微软,360,字节,快手等都考过。

其中一网友在微软的面试中因为这题的边界条件忘记判断被拒,真的是很遗憾,以后做题还是要认真一些。我一直以为像微软这样的大厂面试应该是非常难的,没想到这种中等的题也会考,下面我们就来看下这道题。

15ab0b40690897b9c183f8b9dd7ecd01.png

问题描述

来源:LeetCode第33题

难度:中等

整数数组 nums 按升序排列,数组中的值互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

给你旋转后的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例1:

输入:nums = [4,5,6,7,0,1,2], target = 0

输出:4

示例2:

输入:nums = [4,5,6,7,0,1,2], target = 3

输出:-1

问题分析

这题说的是一个有序数组,数组中的值都不相同,但在某个位置进行了旋转,然后给定一个值target,让我们查找target,但是查找的时候有条件限制,就是查找的时间复杂度是O(log n)。

如果没有这个条件限制,我们可以一个个查询,时间复杂度是O(n)。但因为有这个条件的限制,我们可以考虑使用折半查找,也就是二分查找。

一般情况下如果使用二分查找数组必须是有序的,但这里的有序数组被旋转了一下,没关系,我们依然可以使用二分查找。注意这里中间值mid指向的值和target比较的时候要分4种情况,我们画个图来看下。

91a57d003f03c1a9eff0e4c20bdcc8d5.png

这里再来说下,如果nums[mid] >= nums[left],说明mid左边是有序的,因为有序数组是递增的,只有有序的情况下nums[mid]才会大于等于nums[left]。

否则也就是nums[mid] < nums[left],如果是有序数组nums[mid]不可能小于nums[left],如果nums[mid]的值小于nums[left],说明在left到mid之间出现了旋转。

最后我们再来看下代码:

public int search(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = (left + right) >>> 1;
        if (nums[mid] == target)// 如果找到直接返回下标。
            return mid;
        if (nums[mid] >= nums[left]) {// 左边是有序的。
            // 再判断 target 是在 mid 的左边还是右边,从而调整左右边界。
            if (target >= nums[left] && target < nums[mid]) {
                right = mid - 1;// 在mid的左边
            } else {
                left = mid + 1;// 在mid的右边
            }
        } else {//右边是有序的,同上
            if (target > nums[mid] && target <= nums[right]) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
    }
    return -1;
}

-------------------------end-------------------------

笔者简介

博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解700多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。

### 拼多多前端开发面试经验分享 拼多多作为国内知名的电商平台之一,其技术团队对于前端开发者的需求也较为旺盛。以下是关于拼多多前端开发聘的一些常见面试经验和技巧。 #### 1. **面试流程概述** 拼多多的前端开发岗位通常会有三轮到四轮的技术面试[^1]。具体的面试轮次可能因候选人背景的不同而有所调整。每一轮面试都会涉及不同的技术领域和技术深度测试,旨在全面评估候选人的技术水平和解决问题的能力。 #### 2. **技术考察重点** 在拼多多的前端开发面试中,主要会考察以下几个方面的技能: - **基础知识** 包括但不限于 HTML、CSS 和 JavaScript 的核心概念。例如 DOM 操作、事件机制、闭包、原型链等知识点都是常见的考点[^5]。 - **框架掌握程度** Vue 是目前主流的前端框架之一,因此对 Vue 的深入理解是非常重要的。可能会被问及 Vue 的生命周期钩子函数、组件通信方式以及虚拟 DOM 的原理等问题。 - **算法与数据结构** 虽然前端开发更侧重于界面交互设计,但是基本的数据结构(如数组、栈、队列)和常用算法(排序算法、查找算法)仍然是不可或缺的一部分[^4]。 - **工程化能力** 对 Webpack 等构建工具的理解及其配置方法也是重要的一环。此外,代码版本管理工具 Git 的熟练运用同样会被提及[^3]。 - **实际项目经验** 面试官往往会通过询问过往参与的具体项目细节来判断应聘者解决复杂业务场景问题的实际动手能力和思考逻辑。 #### 3. **软实力考量** 除了硬性的技术考核之外,沟通表达能力、抗压能力和学习适应速度同样是不可忽视的因素。良好的心态能够帮助你在面对挑战时保持冷静并给出合理解答[^2]。 ```javascript // 示例:JavaScript 中的一个经典题目——深拷贝实现 function deepClone(obj) { if (obj === null || typeof obj !== 'object') return obj; const clone = Array.isArray(obj) ? [] : {}; for (let key in obj) { if (obj.hasOwnProperty(key)) { clone[key] = deepClone(obj[key]); } } return clone; } console.log(deepClone({a: {b: [1, 2], c: 3}})); ``` 上述代码展示了如何用递归的方式完成对象的深复制操作,这是经常出现在各类公司笔试或机试题中的例子之一。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据结构和算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值