程序员代码面试指南&剑指offer 刷题总结
1 递归
10 斐波那契数列 JZ7
跳台阶 JZ8
矩形覆盖 JZ10
38 字符串的排列 JZ27
求N!
汉诺塔问题
求字符串所有子序列
母牛的数量
2 贪心策略
变态跳台阶 JZ9
45 把数组排成最小的数 JZ32
14 剪绳子 JZ67
3 动态规划
4 图&回溯法
12 矩阵中的路径 JZ65
13 机器人的运动范围 JZ66
5 数组
未排序正数组中,累加和为给定值的最长子数组长度
6 栈和队列
JZ20 包含min函数的栈 155
JZ64 滑动窗口的最大值
JZ21 栈的压入、弹出序列
7 矩阵
29 顺时针打印矩阵(54. Spiral Matrix)(系列)
旋转矩阵
例如,arr = [1, 2, 1, 1, 1], k = 3 累加和为3的最长子数组为[1, 1, 1],所以结果返回3
[要求] 时间复杂度为O(n),空间复杂度为O(1)
输入描述:
-
第一行两个整数N, k。N表示数组长度,k的定义已在题目描述中给出 第二行N个整数表示数组内的数
输出描述:
-
输出一个整数表示答案
8 树
1 二叉树的深度
2 二叉树的先序、中序、后序遍历(递归,非递归)
3 二叉树的序列化、反序列化
4 平衡二叉树
5 中序遍历的后继、前级节点
补充题目
63 买股票的最佳时机
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
class Solution { public: int maxProfit(vector<int>& prices) { if (prices.empty() || prices.size() < 2) return 0; int min_price = prices[0]; int max_profit = prices[1] - min_price; for (int i = 1; i < prices.size(); i++) { if (prices[i] > min_price) { if (prices[i] - min_price > max_profit) { max_profit = prices[i] - min_price; } } if (prices[i] < min_price) min_price = prices[i]; } return max_profit>0?max_profit:0; //如果是递减数列,则小于0 } };
下一篇:
状态机模式(c语言版设计模式)