diff --git a/notes/面试总结.md b/notes/面试总结.md
index 018d64e5..a8a47dd3 100644
--- a/notes/面试总结.md
+++ b/notes/面试总结.md
@@ -18,6 +18,8 @@
* [14. 剪绳子](#14-剪绳子)
* [15. 二进制中 1 的个数](#15-二进制中-1-的个数)
* [16. 数值的整数次方](#16-数值的整数次方)
+* [17. 打印从 1 到最大的 n 位数](#17-打印从-1-到最大的-n-位数)
+* [18.1 在 O(1) 时间内删除链表节点](#181-在-o1-时间内删除链表节点)
* [参考文献](#参考文献)
@@ -1239,6 +1241,98 @@ public int integerBreak(int n) {
return dp[n];
}
```
+# 17. 打印从 1 到最大的 n 位数
+
+## 题目描述
+
+输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。
+
+## 解题思路
+
+由于 n 可能会非常大,因此不能直接用 int 表示数字,而是用 char 数组进行存储。
+
+使用回溯法得到所有的数。
+
+```java
+public void print1ToMaxOfNDigits(int n) {
+ if (n <= 0)
+ return;
+ char[] number = new char[n];
+ print1ToMaxOfNDigits(number, 0);
+}
+
+private void print1ToMaxOfNDigits(char[] number, int digit) {
+ if (digit == number.length) {
+ printNumber(number);
+ return;
+ }
+ for (int i = 0; i < 10; i++) {
+ number[digit] = (char) (i + '0');
+ print1ToMaxOfNDigits(number, digit + 1);
+ }
+}
+
+private void printNumber(char[] number) {
+ int index = 0;
+ while (index < number.length && number[index] == '0')
+ index++;
+ while (index < number.length)
+ System.out.print(number[index++]);
+ System.out.println();
+}
+```
+
+```python
+def numbersByRecursion(n,largest,result):
+ def recursion(num,largest,result):
+ if num <= largest:
+ result.append(num)
+ return recursion(num+1,largest,result)
+ else:
+ return result
+ return recursion(n,largest,result)
+
+
+
+
+n = 2
+result = []
+largest = pow(10,n)-1
+re = numbersByRecursion(1, largest, result)
+print (re)
+```
+# 18.1 在 O(1) 时间内删除链表节点
+
+## 解题思路
+
+① 如果该节点不是尾节点,那么可以直接将下一个节点的值赋给该节点,然后令该节点指向下下个节点,再删除下一个节点,时间复杂度为 O(1)。
+
+
+
+② 否则,就需要先遍历链表,找到节点的前一个节点,然后让前一个节点指向 null,时间复杂度为 O(N)。
+
+
+
+综上,如果进行 N 次操作,那么大约需要操作节点的次数为 N-1+N=2N-1,其中 N-1 表示 N-1 个不是尾节点的每个节点以 O(1) 的时间复杂度操作节点的总次数,N 表示 1 个尾节点以 O(N) 的时间复杂度操作节点的总次数。(2N-1)/N \~ 2,因此该算法的平均时间复杂度为 O(1)。
+
+```java
+public ListNode deleteNode(ListNode head, ListNode tobeDelete) {
+ if (head == null || head.next == null || tobeDelete == null)
+ return null;
+ if (tobeDelete.next != null) {
+ // 要删除的节点不是尾节点
+ ListNode next = tobeDelete.next;
+ tobeDelete.val = next.val;
+ tobeDelete.next = next.next;
+ } else {
+ ListNode cur = head;
+ while (cur.next != tobeDelete)
+ cur = cur.next;
+ cur.next = null;
+ }
+ return head;
+}
+```
### 动态规划
@@ -1254,6 +1348,97 @@ public int integerBreak(int n) {
}
```
+```python
+class ListNode:
+ def __init__(self, x = None):
+ self.val = x
+ self.next = None
+ def __del__(self):
+ self.val = None
+ self.next = None
+
+class Solution:
+ def list_generate(self, lst):
+ """
+ 生成链表
+ """
+ if not lst:
+ return None
+ list_node = ListNode()
+ list_node.value = lst[0]
+ if len(lst) == 1:
+ list_node.next_node = None
+ else:
+ list_node.next_node = self.list_generate(lst[1:])
+ return list_node
+
+ def find_node(self, node, target_value):
+ """
+ 根据给定的目标值,找出指定节点的位置
+ 非题目要求,只是为了测试验证
+ """
+ if not target_value:
+ return False
+ while node:
+ if node.value == target_value:
+ return node
+ node = node.next_node
+ return False
+
+ def delete_node(self, head_node, del_node):
+ """
+ 删除指定节点
+ """
+ if not (head_node and del_node):
+ return False
+
+ if del_node.next_node:
+ # 删除的节点不是尾节点,而且不是唯一一个节点
+ del_next_node = del_node.next_node
+ del_node.value = del_next_node.value
+ del_node.next_node = del_next_node.next_node
+ del_next_node.__del__()
+ del_next_node.__del__()
+
+ elif del_node == head_node:
+ # 唯一一个节点,删除头节点
+ head_node = None
+ del_node = None
+
+ else:
+ # 删除节点为尾节点
+ node = head_node
+ while node.next_node != del_node:
+ node = node.next_node
+
+ node.next_node = None
+ del_node = None
+
+ return head_node
+
+
+
+if __name__ == '__main__':
+ solution = Solution()
+ head_node = solution.list_generate(['a', 'b', 'c', 'e', 'd', 'd'])
+
+ target_value = 'a'
+ target_node = solution.find_node(head_node, target_value)
+ if target_node:
+ print (target_node.value)
+ head_node = solution.delete_node(head_node, target_node)
+
+
+ node = head_node
+ if node:
+ while node:
+ print (node.value)
+ node = node.next_node
+ if node:
+ print ('->')
+ else:
+ print ('wrong')
+```
# 参考文献