python第一周刷题

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)
#  腊月是十二月

这行代码是在创建一个格式化字符串,将变量 ij 的值插入到字符串中的占位符中。这样的字符串格式化操作是使用 % 运算符进行的。

具体地说,"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)

[总结]

规律题不要按过程编写程序,太复杂了,直接对结果进行编程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值