力扣 - 编程能力入门学习计划(12天)- python实现

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值