【蓝桥杯PythonB组备赛】【Acwing周赛】第90场分析理解

本人小白,几乎没有算法基础,蓝桥杯还剩俩月不到突击备考!(死猪不怕开水烫了属于是)

第一次参加Acwing周赛,只做对了第一题……

目录

一、周赛链接

二、周赛题+分析+代码+知识点学习

A    AcWing 4806. 首字母大写

1.题目描述

2.思路分析

3.代码实现

4.相关知识点复习

B    AcWing 4807. 找数字

1.题目描述

2.思路分析

3.代码实现

4.相关知识点复习

C    AcWing 4808. 构造字符串

1.题目描述

2.思路分析

3.代码实现


一、周赛链接

竞赛 - AcWing


二、周赛题+分析+代码+知识点学习

A    AcWing 4806. 首字母大写

1.题目描述

给定一个由大小写字母构成的单词。

如果单词的首字母为小写字母,则请你将该首字母转换为对应大写字母。

如果单词的首字母为大写字母,则不做任何变化。

输出最终的单词。

输入格式

一个由大小写字母构成的非空字符串,表示给定单词。

输出格式

输出最终的单词。

数据范围

前 33 个测试点满足,输入单词长度范围 [1,10][1,10]。
所有测试点满足,输入单词长度范围 [1,1000][1,1000]。

输入样例1:

ApPLe

输出样例1:

ApPLe

输入样例2:

konjac

输出样例2:

Konjac

2.思路分析

本题比较简单,使用upper()函数即可

3.代码实现

s = input()
print(s[0].upper() + s[1:])

4.相关知识点复习

 本题考点:字符串大小写转换的操作方法

#字符串是不可变序列,每次转换都会产生新的字符串对象,原来的字符串是不变的
(1).upper() 所有字符转成大写字母
(2).lower() 所有字符转成小写字母
(3).swapcase() 所有小写转大写,所有大写转小写 
(4).capitalize() 第一个字符转成大写,其余转成小写
(5).title() 每个单词的第一个字符转成大写,每个单词的其余字符转成小写
Upper (→Up的比较级) adj.上面的;更高的 (up:向上→完全,彻底)
Lower(→low的比较级) adj.更低的→下面的;降下 (low低)
Swap (先后)交换             exchange (同时)交换
Case n.1.情况;案件;病例
      2.箱,盒,容器
(1.cas=cid落下→偶然降临的事情)
(2.catch抓,拿→盛东西的容器)
Capitalize 首字符大写
title 标题;头衔,称号'''
s = 'hello,python'
a = s.upper()  # 字符串是不可变序列,每次转换都会产生新的字符串对象,原来的s 是不变的
print(a, id(a))
print(s, id(s))
t = a.lower()
print(t, id(t))
print(t == s)  # True  (== 内容相同)
print(t is s)  # False (is 地址和内容都相同)
s2 = 'hello Python'
print(s2.swapcase())
print(s2.capitalize())
print(s2.title())

B    AcWing 4807. 找数字

1.题目描述

给定一个正整数 m和一个非负整数 s。

请你找到长度为 m且各位数字之和为 s 的最小和最大非负整数。

要求所求非负整数不得包含前导零。

输入格式

共一行,两个整数 m,s。

输出格式

在一行内输出满足条件的最小和最大非负整数。

如果无解,则输出 -1 -1

数据范围

前 66 个测试点满足 1≤m≤3。
所有测试点满足 1≤m≤100,0≤s≤900。

输入样例1:

2 15

输出样例1:

69 96

输入样例2:

3 0

输出样例2:

-1 -1

2.思路分析

  • 本题不能用暴力,若m == 100,遍历for i in range(10 ** (m - 1), 10 ** m)数据会非常大
  • 所以我们需要对长度为m的整数的每一位进行分析

根据题目条件分析,可得出:

if m == 1:  # 一位数
    if s < 10:
        ...  # 有解 s s
    else:
        ...  # 无解 -1 -1
else:  # 两位数及以上
    if 1 <= s <= 9 * m:  # 每位数上的数字最大是9
        ...  # 有解
    else:
        ...  # 无解 -1 -1

其他都好写,主要看当m > 1 and 1 <= s <= 9 * m的情况:

  • 先定义长度为m的字符串(也可用列表),尝试将所有位置都通过贪心算法填上数
  • 最大的好理解,从左往右优先填9
  • 最小可以反过来想,从右往左优先填9,但是这个数的第一位不能是0吧,所以需要给第一位留一个1

3.代码实现

m, s = map(int, input().split())
if m == 1:  # 一位数
    if s < 10:
        print(s, s)
    else:
        print('-1 -1')
else:  # 两位数及以上
    if 1 <= s <= 9 * m:  # 每位数上的数字最大是9
        ans_min = '0' * m
        ans_max = '0' * m
        # min
        t = s
        for i in range(m - 1, 0, -1):
            t_min = min(9, t - 1)  # 第一位不能为0,所以 t - 1
            ans_min = ans_min[:i] + str(t_min) + ans_min[i + 1:]  # python字符串不可变,故切片
            t -= t_min
        ans_min = str(t) + ans_min[1:]
        # max
        t = s
        while t >= 9:
            ans_max = ans_max.replace('0', '9', 1)  # python字符串不可变,故用replace
            t -= 9
        ans_max = ans_max.replace('0', str(t), 1)
        print(ans_min, ans_max)
    else:
        print('-1 -1')
# 此解并非最优解,只是个人认为比较好理解,请多多包涵

4.相关知识点复习

本题考察贪心算法,不多说啦。

一个小知识点:

  • python字符串是不可变序列,不可以进行增删改操作。如果想修改某个值可以使用切片或者replace函数等
s = "python"
s[0] = 'q'  # × 错误写法
s = 'q' + s[1:]  # √ 可使用切片完成对字符串中某个值的修改

引申:不可变序列与可变序列
(1)不可变序列:字符串、元组(没有增删改操作)
(2)可变序列:列表、字典、集合(可以对序列执行增删改操作,对象地址不发生更改)

C    AcWing 4808. 构造字符串

1.题目描述

2.思路分析

  • 本题数据不大,可以暴力解决。
  • 主要思路:判断字符串t的前缀和后缀有无相同(t[i:] 和 t[:-i]),得出相同的最大部分。之后就可以无限追加后半部分。

3.代码实现

n, k = map(int, input().split())
t = input()  # sfrpmsfrpmsfrpmsfrpm
i = 1
while t[i:] != t[:-i]:
    i += 1
print(t[:i] * k + t[i:])

如有帮助可以点赞收藏嘛~

如有不足或不解之处欢迎评论留言~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头小二

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值