# Homework 01 - Python
## 1. 字符串
给定一个文章,找出每个单词的出现次数。例如给定下面的一篇短文,进行操作。
```
One is always on a strange road, watching strange scenery and listening to strange music. Then one day, you will find that the things you try hard to forget are already gone.
```
**深入思考:**
* 写完程序之后反思一下,如果单词之间是两个空格,或者是`\t`的情况下程序会不会有问题?
* 标点符号如果出现`?`,`/`等和单词挨着,该如何处理?
## 2. 组合
有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
**深入思考:**
* 算法复杂度是?
## 3. 判断
企业发放的奖金根据利润提成。利润(I):
* 低于或等于 10 万元时,奖金可提 10%;
* 高于 10 万元,低于 20 万元时,低于 10 万元的部分按 10%提成,高于 10 万元的部分,可提成 7.5%;
* 20 万到 40 万之间时,高于 20 万元的部分,可提成 5%;
* 40 万到 60 万之间时,高于 40 万元的部分,可提成 3%;
* 60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5%,
* 高于 100 万元时, 超过 100 万元的部分按 1%提成,
从键盘输入当月利润 I,求应发放奖金总数?
**深入思考:**
* 除了用`if`手写,能否用其他方式(例如用list,然后自动实现所有的判断)来实现?
## 4. 循环
输出9x9的乘法口诀表
**深入思考:**
* 如何对齐,看着更清楚?
## 5. 使用while循环实现输出2-3+4-5+6.....+100的和
**深入思考:**
* 除了直接的方法,能否用一句话写完?
## 6. 排序算法
给一个数字列表,将其按照由大到小的顺序排列
例如输入数据为:
```
1, 10, 4, 2, 9, 2, 34, 5, 9, 8, 5, 0
```
输出为:
```
0, 1, 2, 2, 4, 5, 5, 8, 9, 9, 10, 34
```
要求:**自己实现排序算法!**
## 7. 矩阵搜索
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
* 每行的元素从左到右升序排列。
* 每列的元素从上到下升序排列。
示例:
现有矩阵 matrix 如下:
```
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
```
* 给定 target = 5,返回 true。
* 给定 target = 20,返回 false。
## 8. 完数计算
找出1000以内的所有完数,并打印输出。
> 什么是完数? 完全数,又被称作完美数或完备数,是一些特殊的自然数。 它所有的真因子(即除了自身以外的约数)的和,恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。
## 9. 快乐数
编写一个算法来判断一个数 `n` 是不是快乐数。如果 n 是快乐数打印`True` ;不是,则打印输出`False`。
「快乐数」定义为:
* 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
* 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
* 如果 可以变为 1,那么这个数就是快乐数。
**示例1:**
```
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
```
**示例 2:**
```
输入:n = 2
输出:false
```
## 10. 连续的子数组和
给你一个整数数组 `nums` 和一个整数 `k `,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:
* 子数组大小 至少为 2 ,且
* 子数组元素总和为 `k` 的倍数。
如果存在,返回 True ;否则,返回 False 。
> 如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。0 始终视为 k 的一个倍数。
**示例 1:**
```
输入:nums = [23,2,4,6,7], k = 6
输出:true
解释:[2,4] 是一个大小为 2 的子数组,并且和为 6 。
```
**示例 2:**
```
输入:nums = [23,2,6,4,7], k = 6
输出:true
解释:[23, 2, 6, 4, 7] 是大小为 5 的子数组,并且和为 42 。
42 是 6 的倍数,因为 42 = 7 * 6 且 7 是一个整数。
```
**示例 3:**
```
输入:nums = [23,2,6,4,7], k = 13
输出:false
```
## 11. 确定字符串是否包含唯一字符
实现一个算法:识别一个字符串中,是否包含唯一的字符。
如果字符串中的字符都是唯一的,则返回 True,如 '123';如果字符串中的字符有重复,则返回 False,如 '1223'。
**样例1:**
```
输入:123
输出:True
```
**样例2:**
```
输入:1223
输出:False
```
## 12. 能够拼成多少个单词
给出一个由小写字母组成的字符串 s,使用 s 中的字符来拼凑单词 'balloon'(气球)。字符串 s 中的每个字符最多只能被使用一次,求出 s 中的字符最多可以拼凑出多少个单词 'balloon'。
例如:
* 字符串 'nlaebolko' 中的字符最多可以拼凑出1个 'balloon';
* 字符串 'loonbalxballpoon' 中的字符最多可以拼凑出2个 'balloon';
* 字符串 'ballopq' 中的字符最多可以拼凑出0个 'balloon'。
输入与输出
* 输入: 共一行,一个字符串。
* 输出: 共一行,一个整数,表示能拼凑出单词 "balloon"的总个数。
**样例1:**
```
输入:
nlaebolko
输出:
1
```
**样例2:**
```
输入:
loonbalxballpoon
输出:
2
```
**样例3:**
```
输入:
ballopq
输出:
0
```
## 13. 生成激活码
做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?
需要考虑什么是激活码?有什么特性?例如`KR603guyVvR`是一个激活码
## 14. 遍历目录
需要把某个目录下面所有的某种类型的文件找到。
例如把`c:`下面所有的`.dll`文件找到。*需要注意的是,需要递归到每一个目录去查找。*
## 15. 统计代码行数
你有个目录,里面是程序(假如是C或者是Python),统计一下你写过多少行代码。包括空行和注释,但是要分别(例如C程序多少行,Python程序多少行,等等)列出来。
## References
上面的程序只是简单的练练手,仅仅通过上面的程序练习还是不够的,大家需要更多的程序练习才能把Python学好,下面是一些参考的练习题,大家可以挑选一些去做做。
* [Python 练习册,每天一个小程序](https://github.com/Yixiaohan/show-me-the-code)
* [70个python练手项目](practice_projects.md)
* [PythonExercises](https://github.com/greyli/PythonExercises)
* [Python Challenge](http://www.pythonchallenge.com)
* [Python 100例](http://www.runoob.com/python/python-100-examples.html)
* [Python练习题](https://blog.csdn.net/qq_28356833/article/details/54963342)
* [Python实现 66道算法题](https://blog.csdn.net/u012193416/article/details/79253398)
## 练手项目
14、【Python 实现简易 Shell】
23、【Python3 & OpenCV 视频转字符动画】
24、【Python3 实现淘女郎照片爬虫 】
28、【使用 Python 3 编写系列实用脚本】
56、【给Python3爬虫做一个界面.妹子图网实战】
59、【Python 实现简单滤镜】