diff --git a/homework_01_python/homework01.md b/homework_01_python/homework01.md new file mode 100644 index 0000000000000000000000000000000000000000..a7976e31e0cd78e283a4690cad42d7fcd5fd1e8c --- /dev/null +++ b/homework_01_python/homework01.md @@ -0,0 +1,597 @@ +# Homework 01 - Python + + +## 1. 字符串 +给定一个文章,找出每个单词的出现次数。例如给定下面的一篇短文,进行操作。 + +``` +article = "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." +words = article.split() +num = len(words) +for i in range(num): + words[i] = words[i].rstrip('.,').lower() + #print(words[i]) + +for i in set(words): + cont = 0 + for j in words: + if i == j : + cont += 1 + + print('\"',i,'\"',' appears ',cont,' times.') +**深入思考:** +* 写完程序之后反思一下,如果单词之间是两个空格,或者是`\t`的情况下程序会不会有问题? +* 标点符号如果出现`?`,`/`等和单词挨着,该如何处理? + + + +## 2. 组合 + +有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? +`python +sum=0 +for i in range(1,5): + for j in range(1,5): + for k in range(1,5): + if((i!=j)and(j!=k)and(k!=i)): + print(i,j,k) + sum = sum + 1 +print(sum) +**深入思考:** +* 算法复杂度是? + + + +## 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,求应发放奖金总数? +I = input('请输入你的当月利润:') +I = int(I) +bonus = 0 +w1,w2,w4,w6,w10 = 100000,200000,400000,600000,1000000 + +if I <= w1: + bonus = I * 0.1 + print("你应发放的奖金总数为:"+str(bonus)+"元") + +elif I < w2: + bonus = w1*0.1 + (I-w1)*0.075 + print("你应发放的奖金总数为:"+str(bonus)+"元") + +elif I < w4: + bonus = w1*0.1 + (w2-w1)*0.075 +(I-w2)*0.05 + print("你应发放的奖金总数为:"+str(bonus)+"元") + +elif I < w6: + bonus = w1*0.1 + (w2-w1)*0.075 + (w4-w2)*0.05 + (I-w4)*0.03 + print("你应发放的奖金总数为:"+str(bonus)+"元") + +elif I < w10: + bonus = w1*0.1 + (w2-w1)*0.075 + (w4-w2)*0.05 + (w6-w4)*0.03 + (I-w6)*0.015 + print("你应发放的奖金总数为:"+str(bonus)+"元") + +else: + bonus = w1*0.1 + (w2-w1)*0.075 + (w4-w2)*0.05 + (w6-w4)*0.03 + (w10-w6)*0.015 + (I-w10)*0.01 + print("你应发放的奖金总数为:"+str(bonus)+"元") +**深入思考:** +* 除了用`if`手写,能否用其他方式(例如用list,然后自动实现所有的判断)来实现? + + + +## 4. 循环 + +输出9x9的乘法口诀表 +print("--------------------------九九乘法表--------------------------") +for i in range(1,10): + for j in range(1,i+1): + print("%s*%s=%s"%(j,i,i*j),end = " ") + print('\n') +**深入思考:** +* 如何对齐,看着更清楚? + + + +## 5. 使用while循环实现输出2-3+4-5+6.....+100的和 +n = 2 +t = 0 + +while n <= 100: + if n%2 == 0: + t=t+n + else: + t=t-n + n=n+1 + +print("2-3+4-5+6.....+100的和为:"+str(t)) +**深入思考:** +* 除了直接的方法,能否用一句话写完? + + + +## 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 +11, 0, 3, 5, 2, 7, 10, 9, 4, 8, 1, 6 +``` + +上面结果中第一行是排序后的元素;第二行是排序后元素在原始列表中的下标 + + + +要求: + +1. **自己实现排序算法!** +2. 如果列表的长度比较大,如何提高排序的效率? +a = [1, 10, 4, 2, 9, 2, 34, 5, 9, 8, 5, 0] +n = len(a) + +s,s1 = [],[] #s为一个二维数组 +s.append(a) + +for i in range(n): + s1.append(i) +s.append(s1) + +#使用冒泡排序法对列表进行排序 +for x in range(n - 1): + for y in range(n - 1 - x): + if s[0][y] > s[0][y+1]: + s[0][y], s[0][y+1] = s[0][y+1], s[0][y] + s[1][y], s[1][y+1] = s[1][y+1], s[1][y] + +print(s[0],'\n',s[1]) + + +## 7. 矩阵搜索 + +编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: +* 每行的元素从左到右升序排列。 +* 每列的元素从上到下升序排列。 +def search_target(m,target): + l = len(m) + w = len(m[0]) + + flag = False + + for i in range(l): + for j in range(w): + if m[i][j] == target: #若寻得target则修改flag并停止搜索 + flag = True + break + if m[i][j] > target: #若当前值大于target则停止搜索 + break + + if flag or m[i][0] > target: #若flag为True或当前值大于target则停止搜索 + break + + return flag +示例: +现有矩阵 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以内的所有完数,并打印输出。 +for n in range(1,1001): + t = 0 + for i in range(1,n): + if n % i == 0: + t+=i + if t == n: + print(n) +> 什么是完数? 完全数,又被称作完美数或完备数,是一些特殊的自然数。 它所有的真因子(即除了自身以外的约数)的和,恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。 + + + +## 9. 快乐数 + +编写一个算法来判断一个数 `n` 是不是快乐数。如果 n 是快乐数打印`True` ;不是,则打印输出`False`。 +def isHappy(n): + """ + 判断一个数字是否为快乐数 + """ + s = str(n) #将n转换为字符型 + l = [] #一个用于记录每个result的列表 + l.append(n) + flag = False + + while flag == False: + + result = 0 #每一个数字的平方和 + for i in range(len(s)): + result = result + int(s[i])**2 + + if result == 1: #发现快乐数,返回True + flag = True + return flag + elif result in l: #若进入循环,则表示不可能是快乐数,返回False + return flag + + l.append(result) + s = str(result) + +「快乐数」定义为: +* 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 +* 然后重复这个过程直到这个数变为 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 。 +def isZuheshu(m,k): + """ + 判断一个数组是否包含满足条件的子数组合 + """ + flag = False + + for i in range(len(m)): + s=[] # m的子数组 + count = 0 # 子数组s元素之和 + for j in range(i,len(m)): + s.append(m[j]) + count = count + int(m[i]) + if len(s) >= 2 and count % k == 0: + flag = True + return flag + if flag == True: + return flag + + return flag + + +> 如果存在一个整数 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'。 +def isOnly(s): + """ + 识别字符串s中,是否包含唯一的字符 + """ + for i in range(len(s)): + for j in range(i+1,len(s)): + if s[i] == s[j]: + return False + return True + + +**样例1:** +``` +输入:123 +输出:True +``` + +**样例2:** +``` +输入:1223 +输出:False +``` + + + +## 12. 能够拼成多少个单词 + +给出一个由小写字母组成的字符串 s,使用 s 中的字符来拼凑单词 'balloon'(气球)。字符串 s 中的每个字符最多只能被使用一次,求出 s 中的字符最多可以拼凑出多少个单词 'balloon'。 +def balloon(s): + """ + 查看一个字符串里的字母能够拼成几个balloon + """ + c = [0,0,0,0,0] # 设置b,a,l,o,n字母数量的初始值 + balloon = [1,1,2,2,1] # 凑成1个单词所需要的b,a,l,o,n字母数 + + for i in range(len(s)): # 计算输入字符串中五个字母的数量并用c列表计数 + if s[i] == 'b': + c[0] = c[0] + 1 + if s[i] == 'a': + c[1] = c[1] + 1 + if s[i] == 'l': + c[2] = c[2] + 1 + if s[i] == 'o': + c[3] = c[3] + 1 + if s[i] == 'n': + c[4] = c[4] + 1 + + # 求c // ballon 对应位置的商 + x = [] + for i in range(len(c)): + m = int(c[i])//int(balloon[i]) + x.append(m) + + return min(x) +例如: +* 字符串 '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`是一个激活码 +import random +import string + +# string.ascii_letters 26个大小写 +# string.digits 0-9数字 +# 获得激活码中的字母、数字和特殊字符组合 +CHARS = string.ascii_letters + string.digits + '#*' + + +def random_code(count,len = 11): #默认激活码长度为11 + for _ in range(count): + lst = [random.choice(CHARS) for _ in range(len)] #在CHARS范围内随机生成激活码 + print(''.join(lst)) #将序列中的元素以指定字符连接生成新的字符串 '-'/''/'%'... + +# 测试样例 +if __name__ == '__main__': + random_code(200) + + +## 14. 遍历目录 + +需要把某个目录下面所有的某种类型的文件找到。 +例如把`c:\`下面所有的`.dll`或者`.exe`文件找到。 *需要注意的是,通过递归到每一个目录去查找。* +import os + +title = [] +file_paths = [] +def load(path,suffix): + + global title, file_paths + for file in os.listdir(path): # 将path文件下的目录放入到list中 + file_path = os.path.join(path, file) # 连接路径和文件名称,得到文件路径 + + if os.path.isdir(file_path): # 判断是否为子目录 + load(file_path,suffix) # 调用递归函数 + + else: + if os.path.splitext(file)[1] == suffix: # 判断文件类型 + file_paths.append(os.path.join(file_path)) + title.append(os.path.splitext(file)[0]) + + return title + +# 测试样例 +if __name__ == '__main__': + path = "E:\班级" + suffix = '.docx' + print(load(path,suffix)) + + +## 15. 统计代码行数 + +你有个目录,里面是程序(假如是C或者是Python),统计一下你写过多少行代码。包括空行和注释,但是要分别(例如C程序多少行,Python程序多少行,等等)列出来。 +import os + +import time + + +def load(path,suffix): + """ + 参数: + path - 某个文件夹的路径 + suffix - 指定某个文件类型 + + 返回: + file_paths - path下满足suffix文件类型的所有文件路径 + + """ + global title,file_paths + + for file in os.listdir(path): # 将path文件下的目录放入到list中 + + file_path = os.path.join(path, file) # 连接路径和文件名称,得到文件路径 + + if os.path.isdir(file_path): # 判断是否为子目录 + load(file_path,suffix) # 调用递归函数 + + else: + if os.path.splitext(file)[1] == suffix: # 判断文件类型 + file_paths.append(os.path.join(file_path)) + title.append(os.path.splitext(file)[0]) + + return file_paths + + + +def countLine(file_path): + """ + 参数: + file_path - 单个文件的路径 + + 返回: + count - 该文件内容行数 + + """ + count = 0 + for file_line in open(file_path, encoding="utf-8").readlines(): + +# if file_line != '' and file_line != '\n': # 过滤掉空行 +# count = count + 1 + count = count + 1 + +# print(file_path + '----', count) #打印单个文件的行数 + return count + + + +def model(basedir,whitelist): + """ + 参数: + basedir - 文件路径 + whitelist - 指定文件类型 + + 输出: + 在指定文件路径内每种类型文件的行数 + + """ + for i in range(len(whitelist)): + + global file_paths,title + + file_paths,title = [],[] #对file_path置空进行下一种文件类型的计算 + file_paths = load(basedir,whitelist[i]) + + totalline = 0 + + for file_path in file_paths: + totalline = totalline + countLine(file_path) + + print(str(whitelist[i])+"类型文件共有"+str(totalline)+"行") + + + return + + + + + +# 测试样例 + +if __name__ == '__main__': + + startTime = time.perf_counter() + + basedir = 'E:\\DeepLearningPython\\' # 指定文件夹 + whitelist = ['.ipynb','.py'] # 指定文件类型 + + model(basedir,whitelist) # 输出指定文件夹内每种类型文件的行数 + + endTime = time.perf_counter() + print('Cost Time: %0.2fs' % (endTime - startTime)) + + +## References +上面的程序只是简单的练练手,仅仅通过上面的程序练习还是不够的,大家需要更多的程序练习才能把Python学好,下面是一些参考的练习题,大家可以挑选一些去做做。 + +* [Python基础练习题](https://gitee.com/pi-lab/python_turtle/blob/master/python/0-code_practice_1-basic.md) +* [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) +