一、基础运算:A+B问题解析
作为算法入门题,A+B问题要求计算两个整数的和。该题看似简单,却隐含着对输入输出处理、边界条件判断等基础能力的考察。
1.1 题目核心要点
- 数据范围:1≤t≤100组测试数据,每组数据包含两个1≤n≤1000的正整数
- 输入处理:需支持多组测试用例的连续输入
- 输出要求:每组结果单独成行
1.2 代码实现方案
def calculate_sum():t = int(input()) # 读取测试用例数量for _ in range(t):a, b = map(int, input().split())print(a + b)calculate_sum()
1.3 扩展思考
该问题可扩展为:
- 处理浮点数相加
- 支持N个数的求和运算
- 添加输入合法性校验
二、数组操作:移除指定元素
移除数组中特定值的问题考验对数组原地修改的理解,是掌握指针操作的重要练习。
2.1 题目要求
- 原地修改数组(空间复杂度O(1))
- 返回新数组长度
- 元素顺序可改变
2.2 双指针解法
def remove_element(nums, val):k = 0 # 慢指针for i in range(len(nums)): # 快指针if nums[i] != val:nums[k] = nums[i]k += 1return k# 示例nums = [3,2,2,3]print(remove_element(nums, 3)) # 输出: 2print(nums[:2]) # 输出: [2,2]
2.3 性能分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
- 适用场景:大规模数据处理
三、数组变换:有序数组平方
该问题要求将非递减数组的每个元素平方后仍保持有序,涉及排序算法的选择与优化。
3.1 解题思路
- 暴力法:平方后重新排序(时间复杂度O(n log n))
- 双指针法:利用原数组有序特性(时间复杂度O(n))
3.2 优化实现
def sorted_squares(nums):n = len(nums)result = [0] * nleft, right = 0, n - 1for i in range(n-1, -1, -1):if abs(nums[left]) > abs(nums[right]):result[i] = nums[left] ** 2left += 1else:result[i] = nums[right] ** 2right -= 1return result# 示例print(sorted_squares([-4,-1,0,3,10])) # 输出: [0,1,9,16,100]
3.3 边界条件
- 空数组处理
- 全负数数组
- 单元素数组
四、排序算法:数组升序排列
排序是算法基础中的基础,本题要求实现通用排序功能。
4.1 常见排序方案
| 算法 | 时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|
| 冒泡排序 | O(n²) | O(1) | 稳定 |
| 快速排序 | O(n log n) | O(log n) | 不稳定 |
| 归并排序 | O(n log n) | O(n) | 稳定 |
4.2 Python内置排序
def sort_array(nums):return sorted(nums) # 使用Timsort算法# 示例print(sort_array([5,1,1,2,0,0])) # 输出: [0,0,1,1,2,5]
4.3 工业级实现建议
- 小规模数据(n<50):插入排序
- 大规模数据:快速排序或归并排序
- 需要稳定性:归并排序
五、链表操作:移除指定节点
链表删除操作是数据结构基础,考验对指针操作的理解。
5.1 链表节点定义
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = next
5.2 删除实现方案
def remove_nodes(head, val):dummy = ListNode(0) # 创建虚拟头节点dummy.next = headprev, curr = dummy, headwhile curr:if curr.val == val:prev.next = curr.nextelse:prev = currcurr = curr.nextreturn dummy.next
5.3 复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
- 关键点:虚拟头节点简化边界条件处理
六、链表设计:自定义链表实现
本题要求实现完整的链表数据结构,考察面向对象编程能力。
6.1 单链表实现
class MyLinkedList:def __init__(self):self.head = Noneself.size = 0def get(self, index):if index >= self.size or index < 0:return -1curr = self.headfor _ in range(index):curr = curr.nextreturn curr.valdef add_at_head(self, val):self.add_at_index(0, val)def add_at_tail(self, val):self.add_at_index(self.size, val)def add_at_index(self, index, val):if index > self.size:returnnew_node = ListNode(val)if index == 0:new_node.next = self.headself.head = new_nodeelse:prev = self.headfor _ in range(index - 1):prev = prev.nextnew_node.next = prev.nextprev.next = new_nodeself.size += 1def delete_at_index(self, index):if index >= self.size or index < 0:returnif index == 0:self.head = self.head.nextelse:prev = self.headfor _ in range(index - 1):prev = prev.nextprev.next = prev.next.nextself.size -= 1
6.2 设计要点
- 边界条件处理(空链表、索引越界等)
- 虚拟头节点简化操作
- 维护size属性优化查询效率
七、数学计算:回文数判断
回文数问题考察数学运算与逻辑判断能力。
7.1 解题思路
- 字符串转换法:将数字转为字符串比较
- 数学运算法:通过取模运算反转数字
7.2 数学解法实现
def is_palindrome(x):if x < 0 or (x % 10 == 0 and x != 0):return Falsereversed_num = 0original = xwhile x > 0:reversed_num = reversed_num * 10 + x % 10x = x // 10return original == reversed_num# 示例print(is_palindrome(121)) # 输出: Trueprint(is_palindrome(-121)) # 输出: False
7.3 性能优化
- 只需反转一半数字即可比较
- 提前排除负数和末尾为0的非零数
八、算法学习建议
- 分阶段练习:从简单题入手,逐步提升难度
- 多解法对比:对每个问题尝试多种实现方式
- 边界条件测试:特别注意空输入、极值等特殊情况
- 时间复杂度分析:理解不同算法的效率差异
- 代码规范:保持变量命名清晰,添加必要注释
通过系统练习这些经典算法题,开发者可以建立扎实的算法基础,提升问题解决能力,为应对更复杂的编程挑战做好准备。建议每天坚持练习1-2道题目,并定期复习错题,形成完整的知识体系。