上周继续进行蓝桥杯python算法课程的学习,刷了一些题目发现自己还是需要从零开始全方面的再次学习算法,因为上次也提到过我自己对数据结构这一块非常陌生所以我刷的题目中大都含有一些数据结构的元素,为牢记算法中的知识点(对我自己而言)故对我写的题目进行一个简单的整理。
一.
问题描述
给定一个由
0 和 1 组成的字符串 S,你需要根据以下规则修改字符串的最后一个字符:

  • 如果 S 的最后一个字符是 0,则将其替换为 1。
  • 如果 S 的最后一个字符是 1,则将其替换为 0。
    现在,请你输出修改后的字符串。

输入格式
输入一行,包含一个仅由字符 0、1 组成字符串 S。
数据保证字符串的长度为 1 到 100 之间的整数。

这一题的逻辑非常简单,将自己输入的数字存入到创建的字符串中,再将最后一个数字与 1/0 进行对比,最后对字符进行相互转换即可。对于我这种数据结构小白来说最应该思考的就是最后将字符串中最后一个字符提取出来再进行数字上的比较吗?未免有些把简单问题复杂化的感觉,经过思考有了新的方法可以在输入字符串的时候就将字符进行比较,最后把除最后一个字符外的其他字符加上最后应该是 0 还是 1 即可。
我的解题代码如下:

点击查看代码
import os
import sys

s=input()
n=len(s)
if s[-1]=='0':
  result=s[:n-1]+"1"
if s[-1]=='1':
  result=s[:n-1]+"0"
print(result)
可以看到代码也是非常简短的,但其中 if 条件中对数据结构的运用是我以前并不知道的。 result=s[:n-1]+"1"这句代码的意思是:取字符串 s 的前 n-1 个字符然后在这些字符后面拼接上字符 "1"最后将结果赋值给变量 result 。其中 `s[start:end]` 会取索引从 start 到 end-1 的字符等价于`s[0:n-1]`。通过切片+拼接的方式替换字符串的某个部分,适合需要保留大部分原字符串内容,只修改特定位置的场景。同时我询问了AI查询了简化版的替换写法: 1. 使用负索引切片
点击查看代码
result = s[:-1] + "1"
2.转换为列表修改再转回
点击查看代码
char_list = list(s)
char_list[-1] = "1"
result = "".join(char_list)

二.
问题描述
在蓝桥镇,妮妮拥有一片美丽的果园。果园中有 N 种不同的水果树,每种水果树上的水果都有其特别的价值。妮妮记下了每种水果的价值,用一个正整数 Ai 来表示。现在妮妮想知道,如果他把果园里所有种类的水果都摘下来卖掉,他能获得多少的总价值。

你能帮助妮妮计算一下吗?

输入格式
输入的第一行包含一个整数 N,表示果园中水果的种类数。
接下来的一行包含 N 个整数 A1,A2,..,ANA 1,A2,...,AN,分别表示每种水果的价值。其中,满足 1≤N≤100 , 1≤Ai≤100.

这一题也是基础题嘛,没什么难懂的地方,以下是我的解题代码:

点击查看代码
import os
import sys

N=int(input())
values=list(map(int,input().split()))
all=sum(values)
print(all)
但其中有一句代码我印象比较深:`values=list(map(int,input().split()))`这相当于我上次提到的`a,b=map(int,input().split())`只不过这句代码在我的基础上又增加了一个 list 将输入其中的数整合为一个列表,以此不难将 list 转换为数据结构中其他的例子: 1. 转换为元组(tuple)
点击查看代码
data_tuple = tuple(map(int, input().split()))
print(f"元组: {data_tuple}")
print(f"类型: {type(data_tuple)}")

# 示例输入: "1 2 3 4 5"
# 输出: 元组: (1, 2, 3, 4, 5)
2.转换为字符串处理
点击查看代码
# 方法1:保持空格分隔的字符串
values_str = ' '.join(map(str, map(int, input().split())))
print(f"字符串: '{values_str}'")

# 方法2:拼接成连续字符串
nums_str = ''.join(map(str, map(int, input().split())))
print(f"拼接字符串: '{nums_str}'")

# 方法3:使用列表推导式生成字符串
input_str = input()
numbers = map(int, input_str.split())
result_str = ''.join(str(num) for num in numbers)
print(f"结果: {result_str}")
3. 转换为集合(set)
点击查看代码
unique_values = set(map(int, input().split()))
print(f"集合(去重): {unique_values}")

# 示例输入: "1 2 3 2 1"
# 输出: 集合(去重): {1, 2, 3}
4. 转换为字典(dictionary)
点击查看代码
# 方法1:将索引作为键
values = list(map(int, input().split()))
data_dict = {i: val for i, val in enumerate(values)}
print(f"字典(索引为键): {data_dict}")

# 方法2:创建键值对,假设输入是成对的
data = list(map(int, input().split()))
paired_dict = {data[i]: data[i+1] for i in range(0, len(data), 2)}
print(f"配对字典: {paired_dict}")

# 方法3:统计频率
from collections import Counter
freq_dict = Counter(map(int, input().split()))
print(f"频率字典: {freq_dict}")

三.
问题描述
小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。
请问,在 1 到 n 中,所有这样的数的和是多少?

输入描述
输入格式:

输入格式:
输入一行包含两个整数 n(1≤n≤10000).
以下是我的解题代码:

点击查看代码
n = int(input())
result = 0

for number in range(1, n+1): 
    num = str(number)
    for x in num:
        if x in {'2','0','1','9'}:
            result += number
            break 
print(result)
这道题中最核心的点就是怎么判断当前的数字中含不含题目中所给出的数字,也是让我思考了很久哈,最后还是求助了csdn(真好用),可以看到代码中利用` if x in {'2','0','1','9'}:`来进行判断,代码中先将输入进来的字符存入了建立的字符串中,再对其以此提取字符,最后进行比较。等价写法如下:
点击查看代码
# 方法1:使用列表(效率略低)
if x in ['2','0','1','9']:
    pass

# 方法2:使用元组
if x in ('2','0','1','9'):
    pass

# 方法3:逐个比较(不推荐)
if x == '2' or x == '0' or x == '1' or x == '9':
    pass

就先写这几道题了,后面遇到新的题目会接着更新积累知识点,努力成为算法大佬。加油,努力!