File tree 3 files changed +151
-0
lines changed
3 files changed +151
-0
lines changed Original file line number Diff line number Diff line change
1
+ 1 . [ 不用加减乘除做加法] ( https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?tpId=13&tqId=11201&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking )
2
+ 2 . [ 二叉树的镜像] ( https://www.nowcoder.com/practice/564f4c26aa584921bc75623e48ca3011?tpId=13&tqId=11171&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking )
Original file line number Diff line number Diff line change
1
+ ### 题目描述
2
+ 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、* 、/四则运算符号。
3
+ ### 思路
4
+ #### 加法
5
+ 1 . 这个要用二进制来做。对于5 + 7 = 12
6
+ 2 . 5表示成二进制为101
7
+ 7表示成二进制为111
8
+ 3 . 两者亦或的二进制形式为010,正好对应12中的2
9
+ 两者相与的二进制形式为101,正好是5.通过与的性质,我们知道为1的地方都是需要进位的地方。左移一位,变为1010,正好是10
10
+ 4 . 两者相加就是结果了
11
+ 5 . 由于不能用+ - × /,所以,我们要一直循环,当进位为零时,另一个数就是最终结果了。
12
+
13
+ 总结,对于加法,亦或保存的是没有进位的结果,与左移一位表示的是进位结果。
14
+ 减法也可以使用这个来做。
15
+ ### 代码
16
+ 递归
17
+ ``` c++
18
+ class Solution {
19
+ public:
20
+ int Add(int num1, int num2)
21
+ {
22
+ if(num2 == 0)
23
+ return num1;
24
+ int tmp1 = num1^num2;
25
+ int tmp2 = (num1&num2)<<1;
26
+ return Add(tmp1, tmp2);
27
+ }
28
+ };
29
+ ```
30
+ 非递归
31
+ ```c++
32
+ class Solution {
33
+ public:
34
+ int Add(int num1, int num2)
35
+ {
36
+ while(num2 != 0)
37
+ {
38
+ int tmp1 = num1^num2;
39
+ int tmp2 = (num1&num2)<<1;
40
+ num1 = tmp1;
41
+ num2 = tmp2;
42
+ }
43
+ return num1;
44
+ }
45
+ };
46
+ ```
Original file line number Diff line number Diff line change
1
+ ### 题目描述
2
+ 操作给定的二叉树,将其变换为源二叉树的镜像。
3
+ ### 输入描述
4
+ ```
5
+ 二叉树的镜像定义:源二叉树
6
+ 8
7
+ / \
8
+ 6 10
9
+ / \ / \
10
+ 5 7 9 11
11
+ 镜像二叉树
12
+ 8
13
+ / \
14
+ 10 6
15
+ / \ / \
16
+ 11 9 7 5
17
+ ```
18
+ ### 思路
19
+ 很简单,只要左右子树交换一下顺序就行了。
20
+ ### 代码
21
+ 递归形式
22
+ ``` c++
23
+ /*
24
+ struct TreeNode {
25
+ int val;
26
+ struct TreeNode *left;
27
+ struct TreeNode *right;
28
+ TreeNode(int x) :
29
+ val(x), left(NULL), right(NULL) {
30
+ }
31
+ };*/
32
+ class Solution {
33
+ public:
34
+ void Mirror(TreeNode * pRoot) {
35
+ if(pRoot == nullptr)
36
+ return;
37
+ swap(pRoot->left, pRoot->right);
38
+ Mirror(pRoot->left);
39
+ Mirror(pRoot->right);
40
+ }
41
+ };
42
+ ```
43
+ 非递归形式,借助栈或者队列暂存一下元素
44
+ ```c++
45
+ /*
46
+ struct TreeNode {
47
+ int val;
48
+ struct TreeNode *left;
49
+ struct TreeNode *right;
50
+ TreeNode(int x) :
51
+ val(x), left(NULL), right(NULL) {
52
+ }
53
+ };*/
54
+ class Solution {
55
+ public:
56
+ void Mirror(TreeNode *pRoot) {
57
+ if(pRoot == nullptr)
58
+ return;
59
+ stack<TreeNode*> st;
60
+ st.push(pRoot);
61
+ while(st.size()){
62
+ TreeNode *node = st.top();
63
+ st.pop();
64
+ if(node->left || node -> right)
65
+ swap(node->left, node->right);
66
+ if(node->left)
67
+ st.push(node->left);
68
+ if(node->right)
69
+ st.push(node->right);
70
+ }
71
+ }
72
+ };
73
+ ```
74
+ ``` c++
75
+ /*
76
+ struct TreeNode {
77
+ int val;
78
+ struct TreeNode *left;
79
+ struct TreeNode *right;
80
+ TreeNode(int x) :
81
+ val(x), left(NULL), right(NULL) {
82
+ }
83
+ };*/
84
+ class Solution {
85
+ public:
86
+ void Mirror(TreeNode * pRoot) {
87
+ if(pRoot == nullptr)
88
+ return;
89
+ queue<TreeNode* > qu;
90
+ qu.push(pRoot);
91
+ while(qu.size()){
92
+ TreeNode* node = qu.front();
93
+ qu.pop();
94
+ if(node->left || node->right)
95
+ swap(node->left, node->right);
96
+ if(node->left)
97
+ qu.push(node->left);
98
+ if(node->right)
99
+ qu.push(node->right);
100
+ }
101
+ }
102
+ };
103
+ ```
You can’t perform that action at this time.
0 commit comments