Python字符串编程技巧与实战解析
排列字母

代码如下:
s = "WHERETHEREISAWILLTHEREISAWAY"
ans = sorted(s)
print(''.join(ans))
英文字母

代码如下:
n = int(input())
print(chr(64 + n))
工作时长

方法1:excel法

1.复制文件中的时间到单元格A1,点击“数字”修改属性

2.点击“数据”的“升序”
3.在B1单元格输入
=A2-A1
双击右下角"+"填充一整列
4.我们只需要奇数行的差值,在C1输入公式
=IF(MOD(ROW(),2)=1, B1, 0)
双击右下角"+"填充一整列,这样C列只有奇数行保留时间差,偶数行为0
5.在D1输入
=C1 * 86400
因为一天=86400秒,然后设置单元格格式为“数值”
6.在E1求和
=SUM(D:D)
方法2:使用代码
先在同级目录下新建一个文件“text',将题目所给文件里的日期复制进去

import datetime
# 存储时间的列表
time_list=[]
# 这个模板代码要记住 很简单并不是很复杂
with open("text","r") as f:
for time in f.readlines():
time_list.append(time.strip())
# 将字符串 转换为时间格式 的 datetime
trans_time=[]
for time in time_list:
# 对于每一个字符串进行一个转换
trans_time.append(datetime.datetime.strptime(time,"%Y-%m-%d %H:%M:%S"))
# 再进行一个转换,全部转换成秒
s_list=[]
for time in trans_time:
s_list.append(time.timestamp())
# 然后进行一个排序
s_list.sort()
sums=0
#然后进行累计统计
for i in range(1,521,2):
sums+=(s_list[i]-s_list[i-1])
print(int(sums))
罗马数字



代码如下:
n = int(input())
values = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, "D": 500, 'M': 1000}
subtract_pairs = {'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}
for _ in range(n):
s = input()
ans = 0
i = 0
while i < len(s):
if s[i:i+2] in subtract_pairs:
ans += subtract_pairs[s[i:i+2]]
i += 2
else:
ans += values[s[i]]
i += 1
print(ans)
常见减法对只有 6 种:
· IV(4)
· IX(9)
· XL(40)
· XC(90)
· CD(400)
· CM(900)
算法思路
从左到右扫描:
· 先判断当前位置和下一个字符是不是组合减法(优先级高),如果是,就加对应的值,然后跳过 2 个字符。
· 否则,就加上当前字符对应的值,然后进到下一位。
人物相关性分析


代码如下:
import re
k = int(input())
s = input()
# 找出所有 Alice 和 Bob 的位置,记录它们的起始下标
A = [m.start() for m in re.finditer(r'\bAlice\b', s)]
B = [m.start() for m in re.finditer(r'\bBob\b', s)]
count = 0
left = 0
right = 0
lenB = len(B)
for a in A:
L = a - k - 3
R = a + k + 5
# 移动 left 到第一个 ≥ L 的位置
while left < lenB and B[left] < L:
left += 1
# 移动 right 到第一个 > R 的位置
while right < lenB and B[right] <= R:
right += 1
# 区间内的 Bob 个数
count += right - left
print(count)
核心思想:
对每个 Alice 的位置 posA,我们想知道:
哪些 Bob 的位置 posB 满足 |posB - posA| 在一定范围内(考虑单词长度后)?
先考虑 Bob 在 Alice 左边的情况(即 Bob 在前,Alice 在后):
· 中间字符数 = posA - (posB + 3) ≤ K
· 变形得:posB ≥ posA - K - 3
因为 Bob 要在 Alice 左边,所以 posB 要小于 posA,但又要大于等于某个最小值。
再考虑 Bob 在 Alice 右边的情况(即 Alice 在前,Bob 在后):
· 中间字符数 = posB - (posA + 5) ≤ K
· 变形得:posB ≤ posA + K + 5
所以,对当前的 posA,所有符合条件的 posB 必须满足:
posA - K - 3 ≤ posB ≤ posA + K + 5
数字换字母


s = input()
dic = dict()
for i in range(len(s)):
dic[i] = s[i]
t = input()
t_lst = list(t)
num = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
for i in range(len(t_lst)):
if t_lst[i] in num:
t_lst[i] = dic[int(t_lst[i])]
print(''.join(t_lst))
回文判定

代码一:
s = input()
flag = True
if s != s[:-1]:
flag = False
print("Y" if flag else "N")
代码二:
s = input()
n = len(s)
left, right = 0, n - 1
flag = True
while left <= right:
if s[left] == s[right]:
left += 1
right -= 1
else:
flag = False
break
if flag:
print('Y')
else:
print('N')
单词分析


代码如下:
s = input()
dic = dict()
for ch in s:
dic[ch] = dic.get(ch, 0) + 1
dic = sorted(dic.items(), key = lambda x: (-x[1], x[0]))
print(dic[0][0])
print(dic[0][1])
子串简写


代码如下:
k = int(input())
s, c1, c2 = map(str, input().split())
lstA = []#记录c1的位置
lstB = []#记录c2的位置
for i in range(len(s)):
if c1 == s[i]:
lstA.append(i)
elif c2 == s[i]:
lstB.append(i)
j = 0
ans = 0
pos = 0
for i in range(len(lstA)):
while j < len(lstB):
if lstB[j] >= lstA[i] + k - 1:
ans += len(lstB) - j#后续的都会满足条件,直接相加
break
else:
pos = j#标记最后一个值作为下一轮开始的位置
j += 1#继续往后遍历
j = pos
print(ans)
01串的熵

代码如下:
import math
x = 23333333
for i in range(10000000, x // 2):#因为0比1少所以最大值肯定小于x//2
j = x - i#1的个数
if round((i / x * math.log2(i / x)) * i + (j / x * math.log2(j / x)) * j, 4) == -11625907.5798:
print(i)
break
压缩字符串

错误代码:(虽然通过了数据但是逻辑不对,局限 太大)
s = input()
dic = dict()
for ch in s:
dic[ch] = dic.get(ch, 0) + 1
s_ans = ''
flag = False
for key, value in dic.items():
if value == 1 or value == 2:
s_ans += str(key)
else:
s_ans += str(key) + str(value)
flag = True
print(s_ans if flag else "NO")
正确代码:
s = input().strip()
# 特殊情况:空字符串
if not s:
print("NO")
exit()
# 压缩字符串
compressed = []
i = 0
n = len(s)
while i < n:
# 统计连续相同字符的个数
count = 1
while i + count < n and s[i + count] == s[i]:
count += 1
# 按规则添加压缩后的内容
if count == 1:
compressed.append(s[i])
else:
compressed.append(s[i] + str(count))
i += count
# 得到压缩后的字符串
compressed_str = ''.join(compressed)
# 判断是否真的压缩了(长度更短才输出)
if len(compressed_str) < len(s):
print(compressed_str)
else:
print("NO")
错误票据


代码如下:
n = int(input())
a = []
for i in range(n):
a.extend(list(map(int, input().split())))
a.sort()
min_num = a[0]
max_num = a[-1]
n, m = 0, 0
for i in range(min_num, max_num):
if i not in a:
m = i
if a.count(i) == 2:
n = i
print(m, n)
串的处理

s = input()
#将输入字符串按空格分割成单词列表
words = s.split()
ans = ''
#遍历每个单词
for word in words:
#初始化临时字符串,用于存储处理后的单词
tmp = word[0]
#遍历单词的每个字符(除了第一个字符)
for i in range(1, len(word)):
if (word[i].isdigit() and word[i - 1].isalpha()) or (word[i].isalpha() and word[i - 1].isdigit()):
tmp += '_'
#将当前字符添加到临时字符串中
tmp += word[i]
#将临时字符串的首字母大写,其他字母小写
tmp = tmp.capitalize()
ans += tmp + " "
print(ans)
更多推荐


所有评论(0)