剑指offer所有编程练习总结分析

目录

一、剑指offer整体介绍

二、对应题目分析和练习

1.JZ3-数组中重复的数字-(知识点:数组,难度:简单)

2.JZ4-二维数组中的查找-(知识点:数组,难度:中等)

3.JZ11-旋转数组的最小数字-(知识点:二分,难度:简单)

4.JZ17-打印从1到最大的n位数-(知识点:数组,难度:简单)

5.JZ21-调整数组顺序使奇数位于偶数前面(一)-(知识点:数组,难度:简单)

6.JZ81-调整数组顺序使奇数位于偶数前面(二)-(知识点:数组+排序,难度:中等)

7.JZ29-顺时针打印矩阵-(知识点:数组,难度:简单)

8.JZ10-斐波那契数列-(知识点:数组+递归+动态规划+快速幂+记忆化搜索,难度:入门)

9.JZ39-数组中出现次数超过一半的数字-(知识点:哈希,难度:简单)

10.JZ45-把数组排成最小的数-(知识点:数组,难度:中等)

11.JZ47-礼物的最大价值-(知识点:数组+动态规划,难度:中等)

12.JZ53-数字在升序数组中出现的次数-(知识点:数组+二分,难度:简单)

13.JZ49-丑数-(知识点:基础数学+二分,难度:中等)

14.JZ51-数组中的逆序对-(知识点:数组+归并,难度:中等)

15.JZ66-构建乘积数组-(知识点:数组,难度:简单)

16.JZ42-连续子数组的最大和-(知识点:贪心+动态规划,难度:简单)

17.JZ85-a = b + c 的所有可能的组合-(知识点:回溯,难度:中等)

18.JZ56-数组中只出现一次的两个数字-(知识点:哈希+位运算,难度:中等)

19.JZ57-和为S的两个数字-(知识点:数组+双指针,难度:中等)

20.JZ5-替换空格-(知识点:字符串,难度:简单)

21.JZ19-正则表达式匹配-(知识点:字符串,难度:较难)

22.JZ20-表示数值的字符串-(知识点:字符串,难度:较难)

23.JZ38-字符串的排列-(知识点:字符串+递归,难度:中等)

24.JZ48-最长不含重复字符的子字符串-(知识点:字符串,难度:中等)

25.JZ50-第一个只出现一次的字符-(知识点:字符串,难度:简单)

26.JZ58-左旋转字符串-(知识点:字符串,难度:中等)

27.JZ67-把字符串转换成整数-(知识点:字符串,难度:中等)

28.JZ73-翻转单词序列-(知识点:字符串 双指针,难度:简单)

29.JZ74-合为S的连续正数序列-(知识点:穷举,难度:中等)

30.JZ75-字符流中第一个不重复的字符(知识点:字符串,难度:中等)

31.JZ9—用两个栈实现队列(知识点:栈,难度:简单)

32.JZ12-矩阵中的路径-(知识点:DFS,难度:简单)

33.JZ13-机器人的运动范围-(知识点:递归,难度:较难)

34.JZ14-剪绳子-(知识点:基础数学,难度:中等)

35.JZ83-大字符串相加-(基础数学,难度:简单)

36.JZ15-二进制中1的个数-(知识点:基础数学,难度:简单)

37.JZ16-数值的整数次方字-(知识点:基础数学,难度:中等)

38.JZ62-圆圈中最后剩下的数-(知识点:基础数学,难度:中等)

39.JZ63-买卖股票的最好时机-(知识点:贪心+动态规划,难度:简单)

40.JZ64-求1+2+3+···+n数字之和-(知识点:基础数学,难度:中等)

41.JZ65—不用加减乘除做加法(知识点:基础数学,难度:简单)

42.JZ43-从1到n整数中1出现的次数-(知识点:基础数学,难度:中等)

43.JZ6-从尾到头打印链表-(知识点:链表,难度:简单)

44.JZ18-删除链表的节点-(知识点:链表,难度:简单)

45.JZ76-删除链表中的重复结点-(知识点:链表,难度:中等)

46.JZ22-链表中的第k个结点-(知识点:链表,难度:简单)

47.JZ23-链表中环的入口结点-(知识点:链表,难度:中等)

48.JZ24-反转链表-(知识点:链表,难度:简单)

49.JZ25-合并两个排序的链表-(知识点:链表,难度:简单)

50.JZ35-复杂链表的复制-(知识点:链表,难度:较难)

51.JZ52-两个链表的第一个公共的结点-(知识点:链表,难度:简单)

52.JZ26-树的子结构-(知识点:树,难度:中等)

53.JZ27-二叉树的镜像-(知识点:树,难度:简单)

54.JZ28-对称的二叉树-(知识点:树,难度:简单)

55.JZ30—包含main函数的栈(知识点:栈,难度:简单)

56.JZ31-栈的压入弹出序列-(知识点:栈,难度:中等)

57.JZ7-重建二叉树-(知识点:树,难度:中等)

58.JZ8-二叉树的下一个结点-(知识点:树,难度:中等)

59. JZ32-回文串-(知识点:字符串,难度:简单)

60.JZ33-二叉搜索树的后序遍历序列-(知识点:树,难度:中等)

61.JZ82-判断二叉树中是否存在和为某一个值的路径-(知识点:树,难度:简单)

62.JZ34-二叉树中从根结点到叶子结点和为某一个值的所有路径-(知识点:树,难度:中等)

63.JZ84-最大公约数和最小公倍数-(知识点:基础数学,难度:中等)

64.JZ36-二叉搜索树与双向链表-(知识点:分治,难度:中等)

65.JZ37-序列化二叉树-(知识点:树,难度:较难)

66.JZ40-最小的K个数-(知识点:排序,难度:中等)

67.JZ41数据流中的中位数-(知识点:排序,难度:中等)

68.JZ44-数字序列中某一位的数字-(知识点:模拟,难度:简单)

69.JZ46-把数字翻译成字符串-(知识点:动态规划,难度:中等)

70.JZ54-二叉树的深度-(知识点:树,难度:简单)

71.JZ59-滑动窗口的最大值-(知识点:队列,难度:较难)

72.JZ61-扑克牌顺子-(知识点:模拟,难度:简单)

73.JZ69-跳台阶-(知识点:动态规划,难度:简单)

74.JZ71-跳台阶扩展问题-(知识点:动态规划,难度:简单)

75.JZ70-矩阵覆盖-(知识点:动态规划,难度:中等)

76.JZ78-把二叉树打印出多行-(知识点:树,难度:中等)

77.JZ77-按之字形顺序打印二叉树-(知识点:树,难度:中等)

78.JZ79-判定是不是平衡二叉树-(知识点:树,难度:简单)

79.JZ68-二叉搜索树的最近公共祖先-(知识点:树,难度:简单)

80.JZ86-在二叉树中找到两个节点的最近公共祖先-(知识点:树,难度:中等)

81.JZ54-二叉搜索树的第K个节点-(知识点:树,难度:中等)

82.JZx-中文数字表达转实际数字格式-(知识点:哈希,难度:中等)


干货分享,感谢您的阅读!

一、剑指offer整体介绍

《剑指Offer》官方题目练习网址是:剑指offer_在线编程_牛客网

牛客网上的《剑指Offer》题目是非常有价值的,它们经过整理和归纳,覆盖了面试中常见的编程题目和算法问题。以下是对牛客剑指Offer题目的评价和重要性分析:

  1. 高质量的题目:牛客剑指Offer题目通常设计精良,考察面试者在数据结构、算法和编程能力等方面的综合能力。
  2. 真实面试模拟:这些题目常常是从真实的面试题目中选取,因此做题可以帮助面试者熟悉面试流程和类型,提高应对面试的能力。
  3. 广泛覆盖的主题:牛客剑指Offer题目涵盖了很多经典的算法和数据结构,例如数组、链表、树、排序、查找等。这有助于面试者全面复习并加强对这些主题的理解和应用能力。
  4. 算法思维培养:通过解决这些题目,面试者能够培养和提升算法思维和问题解决能力,学会分析和优化算法,提高代码的效率和质量。
  5. 拓展知识面:牛客剑指Offer题目涉及的知识点不仅限于基础的数据结构
### 数位动态规划(Digit DP)概述 数位动态规划是一种专门针对数字问题设计的动态规划技术,主要用于处理涉及数字各个数位特性的计数类问题。通过逐位分析数字并记录状态转移关系,能够高效求解满足特定条件的数字数量。 #### 基本概念 数位DP的核心在于将一个大范围内的数字分解成其每一位上的数值,并基于这些数值构建动态规划的状态空间。这种方法特别适合于解决那些需要枚举大量数字但又可以通过某些约束减少搜索空间的问题[^2]。 #### 动态规划状态定义 在典型的数位DP实现中,常用的状态变量包括当前正在考虑的数位位置以及一些辅助信息来描述已经填充的部分所具有的性质。例如,在LeetCode题目“统计整数数目”中提到的一种常见做法是使用二维数组`dp[i][j]`表示当数字被写到第 `i` 位时,前缀和等于 `j` 的合法方案总数[^3]。 然而更通用的形式可能还需要额外维度用来存储其他限制条件比如是否有前置零或者是否严格小于给定上限等标志位。因此完整的状态可能会扩展为三元组形式 `(pos, sum, tight)` ,其中: - `pos`: 当前处理的是哪一位; - `sum`: 已经累积起来的某项属性总值 (如各位数字加权后的结果); - `tight`: 表明目前形成的序列是否紧贴着输入边界(即前面所有位都取最大允许值),这有助于后续判断剩余可选范围。 #### 转移方程 对于每一个新的待决定的位置 pos 和之前累计的结果 sum 及布尔型变量 tight 来说,下一步应该尝试所有的可能性 d (d 属于 {0,...,9} 或者受限于 upper_limit 如果存在的话),更新下一个状态: ```python for d in range(start_digit, end_digit + 1): new_sum = calculate_new_sum(sum, d) # 更新累加器逻辑取决于具体问题需求 next_tight = True if (tight and d == max_digit_allowed_at_pos[pos]) else False dp[new_pos][new_sum][next_tight] += dp[pos][sum][tight] ``` 这里需要注意两点:一是如何初始化 base case;二是最终答案往往是从多个初始起点出发经过一系列有效转换之后得到的整体贡献集合。 #### 实际案例解析 以 LeetCode 题目为例,“统计整数数目”的目标是在不超过某个固定界限的前提下找出具有指定特征的所有正整数的数量。按照上述框架搭建解决方案如下所示: ```python def countNumbersWithSpecificProperty(n): s = str(n) length = len(s) @lru_cache(None) def dfs(pos, total_sum, is_limit, has_non_zero): if pos == length: return int(has_non_zero) * bool(total_sum % some_condition == target_value) res = 0 up = int(s[pos]) if is_limit else 9 for digit in range(up + 1): new_total_sum = total_sum + digit if has_non_zero or digit != 0 else 0 res += dfs( pos + 1, new_total_sum, is_limit and digit == up, has_non_zero or digit != 0 ) return res return dfs(0, 0, True, False) ``` 此函数采用记忆化递归来代替显式的表格结构维护中间过程数据,从而简化代码书写难度的同时保持较高的执行性能。
评论 1599
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张彦峰ZYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值