在大疆的校园招聘中,除了对专业技能和经验的考察外,编程能力也是评估的一个重要方面。下面我们就来看一道曾经出现在大疆校招中的编程题目,并提供一种可能的解法。
题目描述
给定一个非负整数数组 `nums`,你需要从中找出两个不同的元素,使得它们的和等于给定的目标值 `target`。如果存在多个这样的组合,返回任意一对即可。
例如:
- 输入: `nums = [2, 7, 11, 15]`, `target = 9`
- 输出: `[0, 1]`
解释: 因为 `nums[0] + nums[1] = 2 + 7 = 9`,所以返回 `[0, 1]`。
解题思路
这道题可以通过哈希表来高效解决。我们遍历数组的同时,检查当前元素之前是否存在与之相加等于目标值的元素。如果存在,则返回对应的索引;否则,将当前元素存入哈希表中,以备后续查找。
实现代码
```python
def two_sum(nums, target):
创建一个字典用于存储已经遍历过的数字及其索引
num_dict = {}
for i, num in enumerate(nums):
complement = target - num
检查字典中是否已存在与当前数字互补的数字
if complement in num_dict:
return [num_dict[complement], i]
如果不存在,将当前数字加入字典
num_dict[num] = i
如果没有找到符合条件的两个数字,返回空列表或其他适当值
return []
测试用例
nums = [2, 7, 11, 15]
target = 9
print(two_sum(nums, target)) 输出: [0, 1]
```
代码解析
1. 初始化字典:我们使用一个字典 `num_dict` 来存储已经遍历过的数字及其索引。
2. 遍历数组:对于数组中的每个元素 `num`,计算其补数 `complement`,即 `target - num`。
3. 查找补数:检查补数是否已经在字典中。如果在,则说明找到了满足条件的一对数字,立即返回它们的索引。
4. 更新字典:如果补数不在字典中,则将当前数字及其索引存入字典,以便后续查找使用。
5. 返回结果:如果没有找到符合条件的两个数字,则返回空列表或根据需求返回其他值。
时间复杂度分析
该算法的时间复杂度为 O(n),其中 n 是数组的长度。这是因为我们只需要遍历数组一次,并且每次操作(插入或查找)字典的时间复杂度为 O(1)。
空间复杂度分析
空间复杂度为 O(n),主要是由于我们需要额外的空间来存储字典中的键值对。
通过这种方式,我们可以有效地解决大疆校招笔试中的类似问题。希望这个例子能够帮助你更好地准备面试!