学了python,去面试经常出现,某个或某些库不熟悉导则想不起来怎么写,知道思路而写不出来,多半还是不够熟悉,这里就作为熟悉python的地方,多做做题,多思考。
题目1:店铺ID为00000000-99999999这样的8位数,商家不希望含有2,3,5这几个数字。
a.设计一种方式,能按顺序生成出不重复且不含2,3,5这几个数字的店铺ID;
b.计算符合上述规则的店铺ID共有多少个
1 import time 2 3 # 开始时间:当前时间的时间戳(1970纪元后经过的浮点秒数)。 4 start_time = time.time() 5 6 # 解法1:无脑循环就完了 7 # 最初的列表 8 a = [i for i in range(0, 10)] 9 # 去掉元素列表 10 b = [2, 3, 5] 11 # 求差集 12 c = list(set(a) - set(b)) 13 d = [] 14 for a1 in c: 15 for a2 in c: 16 for a3 in c: 17 for a4 in c: 18 for a5 in c: 19 for a6 in c: 20 for a7 in c: 21 for a8 in c: 22 res = str(a1) + str(a2) + str(a3) + str(a4) + str(a5) + str(a6) + str(a7) + str(a8) 23 d.append(res) 24 # 截止时间 25 end_time = time.time() 26 run_time = end_time - start_time 27 print(len(d), run_time) # 5764801 11.144166231155396
1 import time 2 import itertools 3 # 开始时间:当前时间的时间戳(1970纪元后经过的浮点秒数)。 4 start_time = time.time() 5 6 # 解法2:迭代器 7 # 最初的列表 8 a = [i for i in range(0, 10)] 9 # 如果希望自己输入不希望包含的数字 10 11 # b = input("请输入不希望包含的数字(逗号隔开):").split(",") 12 # # 去引号 13 # for i in range(len(b)): 14 # b[i] = int(b[i]) 15 16 17 # 去掉元素列表 18 b = [2, 3, 5] 19 # 求差集 20 c = list(set(a) - set(b)) 21 res = [x for x in itertools.product(c, repeat=8)] 22 # 截止时间 23 end_time = time.time() 24 run_time = end_time - start_time 25 print(len(res), run_time) # 5764801 0.950455904006958
题目2:不使用任何库函数将时间戳转化成常见的时间格式,只允许使用输入和输出函数。(面试看到的一个题目)
1 import time 2 3 # 生成一个时间戳,好进行后面计算,不在算法内 4 tmp = time.time() 5 6 # 解法1:从本质除非进行运算(时间戳1970纪元后经过的浮点秒数) 7 tmp_year = tmp // (365 * 24 * 60 * 60) + 1970 8 # 计算其中闰年的次数1970 - (tmp_year + 1) 9 # 闰年:能被4整除不能被100整除或能被400整除 10 11 leap_year = [] 12 # 不算今年 13 for year in range(1970, int(tmp_year) + 1): 14 if (year % 4) == 0: 15 if (year % 100) == 0: 16 if (year % 400) == 0: 17 leap_year.append(year) 18 else: 19 continue 20 else: 21 leap_year.append(year) 22 else: 23 continue 24 # print(leap_year) 25 # 判断当前年份是不是闰年,创建月份列表31 2678400 30 2592000 29 2505600 28 2419200 26 # 不是闰年 27 if leap_year[-1] < tmp_year: 28 month_list = [2678400, 2419200, 2678400, 2592000, 2678400, 2592000, 2678400, 2678400, 2592000, 2678400, 2592000, 29 2678400] 30 # 是闰年 31 else: 32 month_list = [2678400, 2505600, 2678400, 2592000, 2678400, 2592000, 2678400, 2678400, 2592000, 2678400, 2592000, 33 2678400] 34 # 闰年数 35 leap_num = int(len(leap_year)) 36 # 去掉闰年,然后在求真实年份 37 tmp_year = (tmp - (366 * 24 * 60 * 60) * leap_num) // (365 * 24 * 60 * 60) + 1970 + leap_num 38 # 去掉年份后还剩余的秒数 39 tmp_month = (tmp - (366 * 24 * 60 * 60) * leap_num) % (365 * 24 * 60 * 60) 40 41 num = 0 42 x = 0 43 for month_num in month_list: 44 num += month_num 45 x += 1 46 if tmp_month < num: 47 # 天数 48 tmp_day = (tmp_month - num + month_num) // (24 * 60 * 60) + 1 49 # 小时---------------这里整整少了6个小时,不知道为啥,以后有能力在来解决吧 50 tmp_hour = ((tmp_month - num + month_num) - (tmp_day - 1) * (24 * 60 * 60)) // 3600 51 # 分钟 秒 52 tmp_min = (((tmp_month - num + month_num) - (tmp_day - 1) * (24 * 60 * 60)) - 3600 * tmp_hour) // 60 53 tmp_sec = (((tmp_month - num + month_num) - (tmp_day - 1) * (24 * 60 * 60)) - 3600 * tmp_hour) % 60 54 # 月份 55 tmp_month = x 56 # 小时 57 58 break 59 60 timeArray = time.localtime(tmp) 61 otherStyleTime = time.strftime("%Y--%m--%d %H:%M:%S", timeArray) 62 print("{}--{}--{} {}:{}:{}".format(int(tmp_year), int(tmp_month), int(tmp_day), int(tmp_hour), int(tmp_min), 63 int(tmp_sec))) 64 print(otherStyleTime) 65 # 2019--10--15 10:0:27 自己求的(小时这一项,不知道为啥少6小时) 66 # 2019--10--15 18:00:27 库函数输出的