1.门牌号
https://www.lanqiao.cn/problems/592/learning/
[自用代码]
total = 0
for i in range(1,2021):
num = str(i)
if not '2' in num:
continue
num_list = list(num)
for a in num_list:
if not a == '2':
continue
total += 1
print(total)
[优秀代码]
b=0
for i in range (1,2021):
a=str(i).count('2')
b+=a
print(b)
[总结]
count() 是Python的内置函数,可以「统计」字符串里指定「字符」或指定字符串出现的「次数」。
语法
String.count( str, start, end )
参数
- str :(必选)指定字符或字符串
- start :(可选,整型)开始的索引,默认0
- end :(可选,整型)结束的索引,默认最后一个位置
2.卡片
https://www.lanqiao.cn/problems/1443/learning/
[自用代码]
import sys
dic1 = {
'0': 0,
'1': 0,
'2': 0,
'3': 0,
'4': 0,
'5': 0,
'6': 0,
'7': 0,
'8': 0,
'9': 0,
}
for i in range(1, 20211):
list1 = list(str(i))
for j in list1:
dic1[j] += 1
if dic1[j] == 2021:
print(i)
sys.exit(0)
我这个算法其实是存在问题的,因为如果最后的数只有一个1,也还剩一张1,这个很简单就是这个数。但是如果最后的数有两个1,只剩一个1,那就要找前面的数了
[修正]
import sys
dic1 = {
'0': 0,
'1': 0,
'2': 0,
'3': 0,
'4': 0,
'5': 0,
'6': 0,
'7': 0,
'8': 0,
'9': 0,
}
total = 0
for i in range(1, 20211):
a = str(i)
for j in dic1:
dic1[j] += a.count(j)
if dic1[j] > 2021:
print(i-1)
sys.exit(0)
受下面的启发,这样一次性的数字数量的加和就可以避免上面的情况了
[优秀题解]
num=0 #用num用来累计用过的数字“1”的次数
for i in range(1,10000):
num+=str(i).count("1") #出现过几次1就 给num加上多少
if num>2021: #当num数量超过2021时卡牌数量不足
break
print(i-1)
[总结]
1是消耗最快的数字,这个点能想到的话就好写了
3.分数
https://www.lanqiao.cn/problems/610/learning/
[优秀代码]
from fractions import Fraction
cur = 1
for i in range(1,20):
cur += Fraction(1,2**i)
print(cur)
[总结]
fractions库的调用方法
https://blog.csdn.net/weixin_43790779/article/details/108693989
4.日期问题
https://www.lanqiao.cn/problems/611/learning/
from datetime import *
a = 0
start = date(1901,1,1)
end = date(2000,12,31)
while start<=end:
if start.weekday()==0:
a+=1
start+=timedelta(days=1)
print(a)
这题的思路,我的想法还是停留在C语言上,算闰年,一步一步来,但这个思路实在是太冗余了,python肯定是由更好的解法。结果是调用datetime库,确实极其的方便。
[总结]
https://blog.csdn.net/json_ligege/article/details/128284233
import datetime
print("当前日期:", today) # 当前日期
print("当前日期(字符串):", today.ctime()) # 返回日期的字符串
print("时间元组信息:", today.timetuple()) # 当前日期的时间元组信息
print("年:", today.year) # 返回today对象的年份
print("月:", today.month) # 返回today对象的月份
print("日:", today.day) # 返回today对象的日
print("星期:", today.weekday()) # 0代表星期一,类推
print("公历序数:", today.toordinal()) # 返回公历日期的序数
print("年/周数/星期:", today.isocalendar()) # 返回一个元组:一年中的第几周,星期几
5.顺子日期
https://www.lanqiao.cn/problems/2096/learning/
res = 0
for i in range(1, 13):
for j in range(1, 32):
s = "2022%02d%02d" % (i, j)
if "012" in s or "123" in s:
res += 1
print(res)
# 腊月是十二月
这行代码是在创建一个格式化字符串,将变量
i
和j
的值插入到字符串中的占位符中。这样的字符串格式化操作是使用%
运算符进行的。具体地说,
"2022%02d%02d" % (i, j)
中的%02d
是一个格式说明符,表示将整数以至少两位宽度的方式进行格式化,不足的位置用零填充。这通常用于表示日期或时间的部分,确保输出的字符串始终是固定宽度的。例如,如果
i
的值是 5,j
的值是 3,那么这个字符串的结果将是"20220503"
。这是一个表示日期的字符串,前四位是年份,接着两位是月份(以零填充),最后两位是日期(以零填充)。这种字符串格式在处理日期数据时比较常见。
这个代码基本就对了,但是他有一些不存在的日期,2月30日,2月31日等,还不够严谨
import datetime
d1 = datetime.date(2022,1,1)#格式化之后的形式就是2022-01-01
d2 = datetime.date(2022,12,31)#格式化之后的形式就是2022-12-31
day = datetime.timedelta(days=1)
m=['012','123','234','345','456','567','678','789']
c=0
while d1<=d2:
str1 = str(d1).replace('-','')#2022-01-01 -> 20220101
for i in range(6):
if str1[i:i+3] in m:#切片去尾
c+=1
break #pay attention
d1+=day#条件变化
print(c)
6.修剪灌木
https://www.lanqiao.cn/problems/2107/learning/
# xilzy's solution(规律是自己被修剪之后,下一次最长到自己被修剪的距离的二倍就是最大高度,所以只需要和左右两端点比较谁更远即可)
##test
##print(max(2,2))
#接收输入,并处理
N=int(input())
for i in range(N):
l_d=i-0 #距离左端点的距离
r_d=N-1-i #距离右端点的距离
print(2*max(l_d,r_d))
有点复杂,确实不好想
有点像一个动态的植树问题,设每棵树位置是i range(N),距离左端点i - 0(最初始的位置是0),2*(i-0)是这棵树向左后又回来长的最大高度;距离右端点N-1 - i(N-1这样保证都是以下标0开始的)(最初始的位置是0)2*(N-1 - i)是这棵树向右后又回来长的最大高度
7.最少砝码
https://www.lanqiao.cn/problems/1461/learning/
对于重量N,我们很轻易的能够得到砝码的个数为x∈[1, N],此时我们更应该关注砝码的个数x,当x == 1时,代表一个砝码,而一个砝码只能称出一个质量:A;当x == 2时,能够称出:A, B, A + B, A - B四种重量(砝码可以放在天平两边);当x == 3时,能够称出:A,B,C, A + B,A - B,A + C,A - C,B + C,B - C,A + B + C,|A+B-C|,|A+C-B|,|B+C-A|共13种,对所得的重量种数,我们可以得出以下顺序:
f(x)=f(x−1)∗3+1
N = int(input())
count = 1
ans = 1
while count < N:
count = count * 3 + 1
ans += 1
print(ans)
[总结]
规律题不要按过程编写程序,太复杂了,直接对结果进行编程