python练习题(常练勿忘)

学了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:无脑循环,究极费时
 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:使用迭代器,省时省力

 题目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 库函数输出的
解法1:思路没问题,但是小时数有误的解法

 

 

 

 

  

 

 

你可能感兴趣的:(python练习题(常练勿忘))