# 算法_01_顺时针打印矩阵
## Question
如果一个3x3的矩阵[ [123] [456] [789] ]
按照从外向里以顺时针的顺序依次打印出每一个数字,那么得到的结果是()
%!C. 123698745!%
## Analysis
可以模拟魔方逆时针旋转的方法,一直做取出第一行的操作
例如
1 2 3
4 5 6
7 8 9
输出并删除第一行后,再进行一次逆时针旋转,就变成:
6 9
5 8
4 7
继续重复上述操作即可
尝试使用算法实现:
# 算法_02_两个链表的第一个公共节点
## Question
如果有两个链表存在公共节点,第一个链表的长度为10,第二个链表的长度为5,
那么公共节点在第一个链表中可能的位置是()
%!A. 0!%
%!B. 2!%
%!C. 4!%
%!D. 6!%
----
## Answer
@!D!@
----
## Analysis
共同节点,意味着从共同节点开始之后所有的节点数都是相同的,这是链表,只要有一个共同节点,那么之后所有的指向
也是重复的。先依次遍历两个链表,记录两个链表的长度m和n,如果 m > n,那么我们就先让长度为m的链表走m-n个结点,然后
两个链表同时遍历,当遍历到相同的结点的时候停止即可。对于 m < n,同理。
# 算法_04_丑数
## Question
把只包含因子2、3和5的数称作丑数(Ugly Number)。那么75前一个和后一个的丑数分别是()
%!A. 64, 80!%
%!B. 73, 77!%
%!C. 72, 80!%
%!D. 64, 81!%
----
## Answer
@!C!@
----
## Analysis
按顺序把每个丑数放在数组中,求下一个丑数
下一个丑数必定由有数组中的某一个丑数A * 2, B * 3, C * 5 的中的最小值得来。
分析:在数组中必定有一个丑数M2, 在它之前的数 * 2 都小于当前最大丑数, 在它之后的数 * 2都大于当前最大丑数,
同样有M3, M5
Tips:题目的意思应该是质数因子,因为8的因子有1,2,4,8,显然不符合要求的,但是质数只有2
# 算法_06_和为s的两个数字
## Question
输入一个递增排序的数组和一个数字S,在数组中查找两个数,他们的和正好是S
请补全以下代码
```
class Solution:
def FindNumbersWithSum(self, array, tsum):
if array == None or len(array) <= 0 or array[____] + array[____] < tsum:
return []
start = 0
end = len(array) - 1
while start < end:
if array[start] + array[end] < tsum:
start ____ 1
elif array[start] + array[end] > tsum:
end ____ 1
else:
return [array[start], array[end]]
return []
```
%!A. -1, -2, += , -=!%
%!B. 0, -1, +=, -=!%
%!C. 0, 1, -=, +=!%
%!D. -2, -1, -=, +=!%
----
## Answer
@!A!@
----
## Analysis
设定两个指针,一个指向数组的起点,一个指向数组的终点,然后对两个数字求和,如果和大于目标值,则把后一个指针前移,
如果和小于目标值,则把前一个指针后移。两个指针交汇的时候如果还没找到,就终止操作。