Day 1 基本数据类型
1523 在区间范围内统计奇数数目
low, high = map(int, input().split())
count = 0
if (low % 2 == 1) & (high % 2) == 1:
count = 2 + (high-low-1)//2
elif (low % 2 == 0) & (high % 2) == 0:
count = (high - low - 1)//2
else:
count = 1 + (high - low)//2
print(count)
1491 去掉最低工资和最高工资后的工资平均值
a = list(map(int, input().split()))
a.sort()
print(sum(a[1:-1])/(len(a)-2))
Day 2 运算符
191 位1的个数
n = input()
# nums = [int(i) for i in str(n)]
# print(nums.count(1))
print(n)
ret = sum(1 for i in range(32) if n & (1 << i))
print(ret)
1281 整数的各位积和之差
n = int(input())
sum = 0
muli = 1
while(n):
sum += n % 10
muli *= n % 10
n //= 10
print(muli-sum)
Day 3 条件语句
976 三角形的最大周长
nums = list(map(int, input().split()))
# 只适合三个数
# per = 0
# for i in range(len(nums)):
# if i == 0:
# if (nums[i] + nums[i+1] > nums[i+2]) & (nums[i] + nums[i+2] > nums[i+1]) & (nums[i+1] + nums[i+2] > nums[i]):
# if (abs(nums[i] - nums[i+1]) < nums[i+2]) & (abs(nums[i] - nums[i+2]) < nums[i+1]) & (abs(nums[i+1] - nums[i+2]) < nums[i]):
# per = nums[i]+nums[i+1]+nums[i+2]
# print(per)
# else:
# print(0)
# else:
# print(0)
# 数组长度3<=nums.length<=10^4
# 对于顺序列表,a<=b<=c,只需判断a+b是否>c即可判断是否能组成一个三角形
nums.sort()
nums.reverse()
print(nums)
s = 0
for i in range(0, len(nums)-2):
if (nums[i] + nums[i+1] > nums[i+2]) & (nums[i] + nums[i+2] > nums[i+1]) & (nums[i+2] + nums[i+1] > nums[i]):
if (abs(nums[i] - nums[i+1]) < nums[i+2]) & (abs(nums[i] - nums[i+2]) < nums[i+1]) & (abs(nums[i+2] - nums[i+1]) < nums[i]):
s = sum(nums[i:i+3])
print(s)
break
if s == 0:
print(0)
1779 找到最近的有相同X或Y坐标的点
from typing import List
class Solution:
def nearestValidPoint(self, x: int, y: int, points: List[List[int]]) -> int:
validPoints = []
dis = []
for i in range(len(points)):
if (points[i][0] == x) | (points[i][1] == y):
validPoints.append([points[i][0], points[i][1]])
dis.append(abs(points[i][0] - x) + abs(points[i][1] - y))
if len(validPoints) == 0:
return -1
else:
return points.index(validPoints[dis.index(min(dis))])
print(Solution().nearestValidPoint(3, 4, points=[[1,2], [3,1], [2,4], [2,3], [4,4]]))
# n, x, y = map(int, input().split())
# points = []
# validPoints = []
# dis = []
# for i in range(n):
# x1, y1 = map(int, input().split())
# points.append([x1, y1])
# if (x1 == x) | (y1 == y):
# validPoints.append([x1, y1])
# dis.append(abs(x1-x)+abs(y1-y))
# if len(validPoints) == 0:
# print(-1)
# else:
# print(points.index(validPoints[dis.index(min(dis))]))
Day 4 循环
1822 数组元素积的符号
nums = list(map(int, input().split()))
neg = 0
for i in nums:
if i < 0:
neg += 1
if i == 0:
print(0)
if neg % 2 == 0:
print(1)
else:
print(-1)
1502 判断能否形成等差数列
arr = list(map(int, input().split()))
arr.sort()
print(arr)
flag = 0
if len(arr) <= 2:
print(True)
for i in range(len(arr)-2):
if arr[i]-arr[i+1] == arr[i+1]-arr[i+2]:
flag = 1
else:
flag = 0
print(False)
break
if flag == 1:
print(True)
202 快乐数
n = int(input())
a = [n]
def getNumber(num):
res = 0
while num != 0:
num, digit = divmod(num, 10)
res += digit**2
return res
s = getNumber(n)
while s:
a.append(s)
if s == 1:
print(True)
break
if a.count(s) >= 2:
print(False)
break
s = getNumber(s)
1790 仅执行一次字符串交换能否使两个字符串相等
str1, str2 = list(map(str, input().split()))
count = 0
a = []
b = []
for i in range(len(str1)):
if str1[i] != str2[i]:
count += 1
a.append(str1[i])
b.append(str2[i])
if count == 0:
print(True)
elif count == 2:
if a[0] == b[1] and a[1]==b[0]:
print(True)
else:
print(False)
elif count > 2:
print(False)
else:
print(False)
Day 5 函数
589 N叉树的前序遍历
暂时先空着
496 下一个更大元素
nums1 = list(map(int, input().split()))
nums2 = list(map(int, input().split()))
ans = []
for i in range(len(nums1)):
for j in range(0, len(nums2)):
if nums1[i] == nums2[j]:
if j == len(nums2)-1:
ans.append(-1)
break
else:
for k in range(j+1, len(nums2)):
if nums2[j] < nums2[k]:
ans.append(nums2[k])
break
if k >= len(nums2)-1 and nums2[k] <= nums2[j]:
ans.append(-1)
break
print(ans)
1232 缀点成线
n = int(input())
coordinates = []
flag = 0
for i in range(n):
x, y = map(int, input().split())
coordinates.append([x, y])
print(coordinates)
if len(coordinates) == 1:
print(True)
else:
x1 = coordinates[0][0]
y1 = coordinates[0][1]
x2 = coordinates[1][0]
y2 = coordinates[1][1]
if x1 != x2:
k = (y1 - y2) / (x1 - x2)
b = y1 - k * x1
for i in range(2, len(coordinates)):
if coordinates[i][1] != k * coordinates[i][0] + b:
print(False)
flag = 1
break
if flag == 0:
print(True)
else:
for i in range(2, len(coordinates)):
if coordinates[i][0] != coordinates[1][0]:
print(False)
flag = 1
break
if flag == 0:
print(True)
Day 6 数组
1588 所有奇数长度子数组的和
# 暴力破解法的遍历顺序;
# i = 0; 1 142 14253
# i = 1; 4 425
# i = 2; 2 253
# i = 3; 5
# i = 4; 3
# arr = list(map(int, input().split()))
# res = 0
# for i in range(len(arr)): # 外层循环遍历整个数组的长度
# length = 1 # length控制步长
# while i + length <= len(arr): # 循环终止条件:i+length<=数组长度
# for j in arr[i:i+length]: # 用切片控制所遍历的列表的长度,从i开始,到length结束
# res += j # 计算子数组中的数的和
# length += 2 # 使子数组的长度逐渐加2
# print(res)
# 重要思想 前缀和!!!
arr = list(map(int, input().split()))
res = 0
# 定义一个前缀和数组prefixSums[i],对于数组下标范围[start,end]的子数组的和为prefixSums[end+1]-prefixSums[start]
prefixSums = [0]*(len(arr)+1) # 比原始数组长度加1,第一个是0
for i, val in enumerate(arr):
prefixSums[i+1] = prefixSums[i] + val
print(prefixSums)
for start in range(len(arr)):
length = 1
while start + length <= len(arr):
end = start + length
res += prefixSums[end] - prefixSums[start]
length += 2
print(res)
283 移动零
nums = list(map(int, input().split()))
left = right = 0
for i in range(len(nums)):
if nums[right] != 0:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right += 1
print(nums)
1672 最富有客户的资产总量
m, n = map(int, input().split())
accounts = []
wealth = 0
max_wealth = []
for i in range(m):
accounts.append(list(map(int, input().split())))
for i in range(m):
wealth = 0
for j in range(n):
wealth += accounts[i][j]
max_wealth.append(wealth)
print(max(max_wealth))
Day 7 数组
1572 矩阵对角线元素的和
m, n = map(int, input().split())
mat = []
sum = 0
for i in range(m):
mat.append(list(map(int, input().split())))
for i in range(len(mat)):
for j in range(len(mat[0])):
if i == j:
sum += mat[i][j]
if j == len(mat[0])-i-1:
sum += mat[i][j]
if len(mat) % 2 == 1:
print(sum-mat[len(mat)//2][len(mat)//2])
else:
print(sum)
566 重塑矩阵
当二维数组(m×n)变成一维数组(1×n)时,(i,j)-> i×n+j,令x = i×n+j,此时可以通过i = x/n; j = x%n 来得到i,j。如果需要重塑矩阵时,将n改成需要重塑的列数即可。
## 方法一:
m, n = map(int, input().split())
r, c = map(int, input().split())
mat = []
matReshape = []
result = []
for i in range(m):
mat.append(list(map(int, input().split())))
if m * n != r * c:
print(mat)
else:
# 变成一维数组,对于二维数组来说len(mat)获取的是行,len(mat[0])获取的是列。
for i in range(len(mat)):
for j in range(len(mat[0])):
matReshape.append(mat[i][j])
# 重塑矩阵
for i in range(0, r):
for j in range(0, c):
if j == 0:
result.append([])
result[i].append(matReshape[j + i * c])
print(result)
## 方法二:
# 当二维数组(m*n)变成一维数组(1*n)时,(i,j)-> i*n+j, 令x = i*n+j,此时可以通过i = x/n; j = x%n 来得到i,j。
# 如果需要重塑矩阵时,将n改成需要重塑的列数即可
# ans = [[0] * c for _ in range(r)] #_只是一个占位符,表示未用到,但是需要循环r次,也可以用i来代替
# for x in range(m * n):
# ans[x // c][x % c] = mat[x // n][x % n] # 不再需要借助一维数组了,直接重塑。新矩阵是r行c列,旧矩阵是m行n列。
# print(ans)
Day 8 字符串
1768 交替合并字符串
word1, word2 = map(str, input().split())
str = word1 + word2
str1 = ''
for i in range(len(str)):
if len(word1) > len(word2):
if i + len(word1) < len(str):
str1 += str[i]+str[i+len(word1)]
else:
str1 += str[i:len(word1)]
break
else:
if i < len(word1):
str1 += str[i]+str[i+len(word1)]
else:
str1 += str[len(word1)+i:]
break
print(str1)
1678 设计Goal解析器
可用replace函数使用一行代码来设计Goal解析器
## 方法一:
command = input()
res = ''
for i in range(len(command)):
if command[i] == 'G':
res += 'G'
elif command[i] == '(' and command[i+1] == ')':
res += 'o'
elif command[i] == '(' and command[i+1] == 'a' and command[i+2] == 'l' and command[i+3] == ')':
res += 'al'
print(res)
## 方法二:用replace一行代码解决
print(command.replace('()', 'o').replace('(al)', 'al'))
389 找不同
方法一: 直接遍历s字符串,在s字符串里找多余的字符
方法二:求和 将s的ASCII值与t的ASCII的值分别求和再相减,剩余的就是多出来的数字的ACCII
方法三:使用异或(自己与自己异或得0,自己与0异或得自己)将所有字符串进行异或,即可找到只出现奇数次的数字
s, t = input().split()
# for i in range(len(t)):
# if s.find(t[i]) == -1: # str.find()找某个字符串中是否存在某个字符,如果包含子字符串返回开始的索引值,否则返回-1。
# print(t[i])
# else:
# s = s.replace(t[i], '', 1)
## 方法二:求和 将s的ASCII值与t的ASCII的值分别求和再相减,剩余的就是多出来的数字的ACCII
# sum1 = sum2 = 0
# for i in s:
# sum1 += int(ord(i))
# print(sum1)
# for i in t:
# sum2 += int(ord(i))
# print(sum2)
# print(chr(sum2-sum1))
## 方法三:使用异或 找到只出现奇数次的数字
str1 = s+t
res = 0
for i in range(len(str1)):
res = res ^ ord(str1[i])
print(chr(res))
Day 9 字符串
709 转换成小写字母
# 方法一:用python自带函数,小写转大写->str.upper();大写转小写->str.lower()
# s = input()
# print(s.lower())
# 方法二:用ASCII+32
s = input()
b = [0]*len(s)
for i in range(len(s)):
b[i] = ord(s[i])
if b[i] <= 90 and b[i] >= 65: ## ASCII码大写的Z是90
b[i] += 32
b[i] = chr(b[i])
s = ''.join(b) # 字符串无法直接进行修改 可利用列表修改 再用join函数连接成新字符串
print(s)
1309 解码字母到整数映射
思路:(1)准备一个新的空字符串(2)使用while循环,用i来控制不同情况下的不同的步长
s = input()
b = ''
i = 0
while i < len(s):
if i+2 < len(s) and s[i+2] == '#':
b += chr(int(s[i: i + 2]) + 96)
i += 3
else:
b += chr(int(s[i]) + 96)
i += 1
print(b)
953 验证外星语词典
思路:(1)将两两相邻的字符串进行比较,遍历这两个字符串的字母(2)如果发现首个不同的字母,比较其在order里的下标,若字符串1不同字母的下标>字符串2不同字母的下标,则跳出循环,若某个字符串已经遍历完,仍未遇见不同的字符,此时比较两个字符串的长度,若字符串1比字符串2长,则输出False,跳出循环。(3)前两个字符串比较完成,则继续循环i,比较下一个两两相邻的字符串。
words = input().split()
order = input()
flag = 0
for i in range(len(words)-1):
word1 = words[i]
word2 = words[i+1] # 两两相邻的字符串进行比较
for j in range(min(len(word1), len(word2))):
if word1[j] != word2[j]: # 找到两个字符串首个不相同的字母
if order.find(word1[j]) > order.find(word2[j]): # 比较这两个字母在字典中的顺序
print(False)
flag = 1
break
else:
if len(word1) > len(word2):
print(False)
flag = 1
if flag == 1:
break
if flag == 0:
print(True)