编程是软件工程师的基石,掌握一系列经典编程题目能够帮助工程师提高解决问题的能力,增强逻辑思维,以及提升算法和数据结构的知识。以下是一些软件工程师必刷的50个经典编程题目及其详解,涵盖了不同难度和类型。
1. 两数之和
问题描述:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
def twoSum(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
2. 盛最多水的容器
问题描述:给定 n 个非负整数 a1,a2,…,an,每个数代表一个坐标,请找出能容纳最多的水的容器。
def maxArea(height):
left, right = 0, len(height) - 1
max_area = 0
while left < right:
max_area = max(max_area, min(height[left], height[right]) * (right - left))
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area
3. 无重复字符的最长子串
问题描述:给定一个字符串,找出不含有重复字符的最长子串的长度。
def lengthOfLongestSubstring(s):
char_map = {}
max_length = 0
start = 0
for end, char in enumerate(s):
if char in char_map:
start = max(start, char_map[char] + 1)
char_map[char] = end
max_length = max(max_length, end - start + 1)
return max_length
4. 整数反转
问题描述:给定一个32位有符号整数,你需要将这个整数反转。
def reverse(-2147483648):
INT_MAX = 2147483647
INT_MIN = -2147483648
result = 0
while x != 0:
pop = x % 10
x //= 10
if result > INT_MAX // 10 or (result == INT_MAX // 10 and pop > 7):
return 0
if result < INT_MIN // 10 or (result == INT_MIN // 10 and pop < -8):
return 0
result = result * 10 + pop
return result
5. 最长公共前缀
问题描述:编写一个函数来查找字符串数组中的最长公共前缀。
def longestCommonPrefix(strs):
if not strs:
return ""
prefix = strs[0]
for s in strs[1:]:
while not s.startswith(prefix):
prefix = prefix[:-1]
if not prefix:
return ""
return prefix
…(以下省略45个题目,仅提供部分题目作为示例)
50. 最小路径和
问题描述:给定一个包含非负整数的二维网格,找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
def minPathSum(grid):
m, n = len(grid), len(grid[0])
dp = [[0] * n for _ in range(m)]
dp[0][0] = grid[0][0]
for i in range(1, m):
dp[i][0] = dp[i-1][0] + grid[i][0]
for j in range(1, n):
dp[0][j] = dp[0][j-1] + grid[0][j]
for i in range(1, m):
for j in range(1, n):
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
return dp[-1][-1]
通过这些题目的练习,软件工程师不仅能够提升自己的编程能力,还能够加深对算法和数据结构的理解。记住,每解决一个问题,都要回顾其背后的原理和可以应用的场景,这样才能在未来的工作中游刃有余。
