📅  最后修改于: 2023-12-03 15:42:31.912000             🧑  作者: Mango
本文将分享作者在校内参加飞利浦软件工程师面试的经历和面试题目。在此次面试中,作者主要接受了笔试和技术面试两个环节的考核。
笔试环节主要是对程序员基本能力的考察,涵盖多个领域,包括但不限于计算机网络、数据结构、算法等。其中一道典型的题目如下:
给定一个长度为n的正整数数组,输出该数组的最大子序列和。
示例1:
输入:[-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6。
示例2:
输入:[1]
输出:1
提示:
- 1 <= n <= 10^5
- -10^4 <= nums[i] <= 10^4
参考代码如下:
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
if not nums:
return 0
ans = float('-inf')
cur_sum = 0
for num in nums:
# 若当前sum小于等于0,则舍弃前面的子序列
# 否则,与当前num组成新的连续子序列
cur_sum = max(cur_sum + num, num)
ans = max(ans, cur_sum)
return ans
技术面试主要是考察应聘者的编程思路和解决问题的能力。在此次面试中,作者接受了一道困难的题目,如下:
给出n个整数,找到其中两个不相交的连续子串,每个子串中的元素都不相同,且这两个子串的长度之和最大。
示例:
输入: [1,2,1,3,2,7,5,2]
输出: 13
解释: 符合要求的最大长度为13的两个子串是 [1,2,1,3,2,7] 和 [5,2]。
提示:
- 1 <= n <= 10^5
- -10^3 <= nums[i] <= 10^3
参考代码如下:
class Solution:
def maxSumTwoNoOverlap(self, nums: List[int], firstLen: int, secondLen: int) -> int:
# Compute the prefix sums array
N = len(nums)
prefix = [0] * N
prefix[0] = nums[0]
for i in range(1, N):
prefix[i] = prefix[i - 1] + nums[i]
def findOptimalMax(N: int, prefix: List[int], firstLen: int, secondLen: int) -> int:
# Compute the maximum sum from the start with size `firstLen`
ans, maxPrefixFirst = prefix[firstLen - 1], prefix[firstLen - 1]
for i in range(firstLen, N):
maxPrefixFirst = max(maxPrefixFirst, prefix[i] - prefix[i - firstLen])
ans = max(ans, maxPrefixFirst + (prefix[i] - prefix[i - firstLen]))
# Compute the maximum sum from the end with size `secondLen`
maxSuffixSecond = prefix[-1] - prefix[-secondLen - 1]
for i in range(N - secondLen - 1, -1, -1):
maxSuffixSecond = max(maxSuffixSecond, prefix[i + secondLen] - prefix[i])
ans = max(ans, maxSuffixSecond + (prefix[i + secondLen - 1] - (prefix[i - 1] if i > 0 else 0)))
return ans
# Find the maximum sum of `firstLen` and `secondLen`.
return findOptimalMax(N, prefix, firstLen, secondLen)
以上是作者在参加飞利浦校招的软件工程师面试中,接受的笔试和技术面试的题目和解答。希望对读者有所启发。