程序员代码面试指南&剑指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
    }
};
经验分享 程序员 微信小程序 职场和发展