[特殊字符] 「Python 编程实战:10 道必刷题解析 + 录屏讲解,从数组操作到矩阵算法!」

一、问答题

(1)假设 lst=[30,1,2,1,0],在应用下面的每条语句之后列表变成了什么?假设每行代码都是独立的。

lst.append(40)
lst.insert(1,43)
lst.extend([1,43])
lst.remove(1)
lst.pop(1)
lst.pop()
lst.sort()
lst.reverse()
random.shuffle(lst)
  1. [30, 1, 2, 1, 0, 40]

  2. [30, 43, 1, 2, 1, 0]

  3. [30, 1, 2, 1, 0, 1, 43]

  4. [30, 2, 1, 0]

  5. [30, 2, 1, 0]

  6. [30, 1, 2, 1]

  7. [0,1,1,2,30]

  8. [0,1,2,1,30]

  9. 随机打乱

(2)假设Ist=[30,1,2,1,0],下面每条语句的返回值是什么?

lst.index(1)
lst.count(1)
len(lst)
max(lst)
min(lst)
sum(lst)
  1. 1
  2. 2
  3. 5
  4. 30
  5. 0
  6. 34

(3)假设 list1=[30,1,2,1,0] 而 list2=[1,21,13],下面每条语句的返回值是什么?

list1 + list2
2 * list2
list2 * 2
list1[1 :3]
list1[3]
  1. [30, 1, 2, 1, 0, 1, 21, 13]
  2. [1, 21,13, 1, 21, 13]
  3. [1, 21, 13, 1, 21, 13]
  4. [1,2]
  5. [1]

(4)假设 Ist=[30,1,2,1,0],下面每条语句的返回值是什么?

[x for x in list1 if x > 1]
[x for x in range(0,10,2)]
[x for x in range(10,0,-2)]

30, 2

0, 2, 4, 6, 8

10, 8, 6, 4, 2

(5)假设 list1 =[30,1,2,1,0]而 list2=[1,21,13],下面每条语句的返回值是什么?

list1 < list2
list1 <= list2
list1 == list2
list1 != list2
list1 > list2
list1 >= list2

False

False

False

True

True

True

(6)在执行完下面的代码行之后list1和list2 是什么?

list1 = [1,43]
list2 = [x for x in list1]
list1[0]= 22

list1= [22, 43]

list2 = [1,43]

(7)如何从字符串中获取一个列表?假设s1是welcome。那么 s1.split('o’)是什么?

‘welc’, ‘me’

(8)下面代码的输出是什么?

lst = [1,2,3,4,5,6]
for i in range(1,6):
	lst[i] = lis[i - 1]
print(lst)

1, 1, 1, 1, 1, 1

(9)下面代码的输出是什么?

list1 = list(range(1102))
list2 =[] + list1
list1[0]= 111
print(list1)
print(list2)

1, 3, 5, 7, 9

(10)给出下面两段程序的输出:

#代码A
def main():
	number =0
	numbers =[10]
	
	m(number,numbers)
	
	print("number is", number,"and numbers[0]is",numbers[0])
	
def m(x,y):
	x = 3
	y[0]= 3
	
main()

number is 0 and numbers[0] is 3

#代码B
def main():
	lst=[12345]
	reverse(lst)
	for value in lst:
		print(value,end='')
		
def	reverse(lst):
	newLst = len(lst) * [0]
	for i in range(len(lst)):
		newLst[i]= lst[len(lst) - 1 - i]
		
	lst= newLst
	
main()

[5, 4, 3, 2, 1,]

二、编程题

(11)指定等级

题目描述

读入学生成绩,获取最高分best,然后根据下面的规则赋等级值:

(1)如果分数≥best-10,等级为A

(1)如果分数≥best-20,等级为B

(1)如果分数≥best-30,等级为C

(1)如果分数≥best-40,等级为D

(1)其他情况,等级为F

输入输出描述

输入两行,第一行输入学生人数n,第二行输入n个学生的成绩

输入n行,表示每个学生的成绩等级

示例

输入:

4

40 55 70 58

输出:

学生0分数为40,等级为C

学生1分数为55,等级为B

学生2分数为70,等级为A

学生3分数为58,等级为B

#指定等级
#人数
n = int(input())
#成绩
arr = list(map(float, input().split(" ")))
#获取最高分
max_score = max(arr)
for index in range(len(arr)):
    str = ""
    if max_score - 40 <= arr[index] < max_score - 30:
        str = f'学生{index}分数为{arr[index]:.0f},等级为D'
    elif max_score - 30 <= arr[index] < max_score - 20:
        str = f'学生{index}分数为{arr[index]:.0f},等级为C'
    elif max_score - 20 <= arr[index] < max_score - 10:
        str = f'学生{index}分数为{arr[index]:.0f},等级为B'
    elif arr[index] >= max_score - 10:
        str = f'学生{index}分数为{arr[index]:.0f},等级为A'
    else:
        str = "等级为F"
    print(str)

(12)打印不同的数

题目描述

读入n个数字,并显示互不相同的数(即一个数出现多次,但仅显示一次),数组包含的都是不同的数

输入输出描述

输入两行,第一行为数字的个数n,第二行为n个数字

输出数组,包含的都是不同的数

示例

输入:

10

1 2 3 2 1 6 3 4 5 2

输出:

1 2 3 6 4 5

#打印不同的数
#数字个数
n = int(input())
#数字
arr = [int(i) for i in input().split(" ")]
arr2 = []

for i in range(len(arr)):
    for j in range(i + 1, len(arr)):
        if arr[i] == arr[j]:
            break
    else:
        arr2.append(arr[i])
print(arr2)

(13) 打乱数组

题目描述

编程程序,对给定的数组 [1, 2, 3, 4, 5, 6, 7, 8, 9] 进行随机打乱,并输出打乱后的结果

#打乱数组
import random
def list_shuffle(arr):
    for i in range(len(arr)):
        j = random.randint(0,len(arr) - 1)
        arr[i], arr[j] = arr[j], arr[i]


arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list_shuffle(arr)
print(arr)

(14) 更衣室难题【录屏讲解】

**视频链接:**录制: 录制1
录制文件:https://meeting.tencent.com/crm/KmdRqq3qa3

题目描述

一个学校有100个更衣室和100个学生。所有的更衣室在开学第一天都是锁着的。随着学生进入,第一个学生表示为S1,打开每个更衣室;然后第二个学生S2,从第二个更衣室开始,用L2表示,关闭所有其他更衣室;学生S3从第三个更衣室L3开始,改变每三个更衣室(如果打开则关闭,如果关闭则打开);学生S4从更衣室L4开始,改变每四个更衣室;学生S5开始从更衣室L5开始,改变每五个更衣室。依次类推,直到学生S100改变L100。

在所有学生都经过了操作后,哪些更衣室是打开的?编程找出答案。

#更衣室难题
arr = [0] * 100
# i 表示学生
for i in range(1,len(arr) + 1):
    #第一个学生打开全部更衣室
    if i == 1:
        for j in range(i - 1, len(arr)):
            arr[j] ^= 1
    #第二个学生关闭所有更衣室,从第二个开始
    elif i == 2:
        for j in range(i - 1, len(arr)):
            arr[j] ^= 1
    else:
        for j in range(i - 1, len(arr), i):
            arr[j] ^= 1
    
for i in range(len(arr)):
    if arr[i] == 1:
        print(f'L{i + 1}', end = " ")

(15)矩阵相乘

题目描述

为了实现矩阵A乘以矩阵B,矩阵A的列数必须等于矩阵B的行数

假设矩阵C是相乘的结果,矩阵A的列数为n,那么每个元素 C i j = A i 1 ∗ B 1 j + A i 2 ∗ B 2 j + . . . + A i n ∗ B n j C_{ij}=A_{i1}*B_{1j}+A_{i2}*B_{2j}+...+A_{in}*B_{nj} Cij=Ai1B1j+Ai2B2j+...+AinBnj

例如,对于两个3×3的矩阵A和B:

[特殊字符] 「Python 编程实战:10 道必刷题解析 + 录屏讲解,从数组操作到矩阵算法!」_第1张图片

其中 C i j = A i 1 ∗ B 1 j + A i 2 ∗ B 2 j + A i 3 ∗ B 3 j C_{ij}=A_{i1}*B_{1j}+A_{i2}*B_{2j}+A_{i3}*B_{3j} Cij=Ai1B1j+Ai2B2j+Ai3B3j

输入输出描述

输入矩阵A的行列rowA和colA,接下来输入rowA行,每行colA个元素

输入矩阵B的行列rowB和colB,接下来输入rowB行,每行colB个元素

输出rowA行colB列的矩阵,为相乘的结果

示例

输入:

3 3

1 2 3

4 5 6

7 8 9

3 3

0 2.0 4.0

1 4.5 2.2

1.1 4.3 5.2

输出:

5.3 23.9 24

11.6 56.3 58.2

17.9 88.7 92.4

#输入矩阵A
rowA, colA = map(int, input().split(" "))
matrix = []
for i in range(rowA):
    row = list(map(float, input().split(" ")))
    matrix.append(row)
#输入矩阵B
rowB, colB = map(int, input().split(" "))
matrix2= []
for i in range(rowA):
    row = list(map(float, input().split(" ")))
    matrix2.append(row)

#初始化矩阵3
matrix3 = []
for i in range(rowA):
    row = [0] * colA
    matrix3.append(row)

#计算矩阵A * B
for i in range(rowA):
    for j in range(colB):
        for k in range(colA):
           matrix3[i][j] += matrix[i][k] * matrix2[k][j]
#输出
for i in range(rowA):
    for j in range(colA):
        print(f'{matrix3[i][j]:.1f}', end = " ")
    print()
        

(16)按列排序

题目描述

输入一个矩阵,然后把每列进行升序排序,并输出结果

输入输出描述

输入矩阵的行列n和m,接下来输入n行,每行m个元素

输出按列排序后的矩阵

示例

输入:

4 4

4 5 8 2

5 1 7 3

9 4 2 1

8 3 6 6

输出:

4 1 2 1

5 3 6 2

8 4 7 3

9 5 8 6

#按列排序
n, m = map(int, input().split(" "))
matrix = []
for i in range(n):
    row = list(map(float, input().split(" ")))
    matrix.append(row)

#取出每一列然后排序
for j in range(len(matrix[0])):
    line = []
    for i in range(n):
        line.append(matrix[i][j])
    line.sort()
    #把原矩阵的列更新为排好序的列
    for i in range(n):
        matrix[i][j] = line[i]
#打印矩阵
for i in range(n):
    for j in range(m):
        print(f'{matrix[i][j]:.0f}', end = " ")
    print()

(17)螺旋矩阵【录屏讲解】

**视频链接:**录制: 录制2
录制文件:https://meeting.tencent.com/crm/KPGeoo3W08

题目描述

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

输入输出描述

输入矩阵的行列row和col,接下来有row行输入,每行col个数字

输出遍历后的结果

示例

输入:

3 4

1 2 3 4

5 6 7 8

9 10 11 12

输出:

1 2 3 4 8 12 11 10 9 5 6 7

def solve(matrix):
    #定义出上下左右边界
    top, bottom = 0, len(matrix) - 1
    left, right = 0, len(matrix[0]) - 1
    result = []
    while top <= bottom and left <= right:
        #从左到右遍历
        for i in range(left, right + 1):
            result.append(matrix[top][i])
        top += 1
        #从上到下遍历
        for i in range(top, bottom + 1):
            result.append(matrix[i][right])
        right -= 1
        #如果还有行从右往左
        if top <= bottom:
            for i in range(right, left - 1, -1):
                result.append(matrix[bottom][i])
            bottom -= 1
        #如果还有列 从右往左
        if left <= right:
            for i in range(bottom, top - 1, -1):
                result.append(matrix[i][left])
            left += 1
    return result


row, col = map(int, input().split(" "))
matrix = []
for i in range(row):
    rows = list(map(int, input().split(" ")))
    matrix.append(rows)

print(solve(matrix))

(18) 探索二维矩阵 II

题目描述

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列
  • 每列的元素从上到下升序排列

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

输入输出描述

输入矩阵的行row和列col,和目标值target

接下来输入row行,每行col个元素

输出是否存在

示例

输入:

5 5 5

1 4 7 11 15

2 5 8 12 19

3 6 9 16 22

10 13 14 17 24

18 21 23 26 30

输出:

true

def search(arr, target):
    left = 0
    right = len(arr) - 1
    while True:
        mid = (left + right) // 2
        if target > arr[mid]:
            left = mid + 1
        elif target < arr[mid]:
            right = mid - 1
        else:
            return True
        if left > right:
            return False

def solve(matrix, target):
    for i in range(len(matrix)):
        if matrix[i][0] <= target <= matrix[i][len(matrix[i]) - 1]:
            if search(matrix[i], target):
                return True
    return False
    

row, col, target = map(int, input().split(" "))
matrix = []
for i in range(row):
    rows = list(map(int, input().split(" ")))
    matrix.append(rows)

print(solve(matrix, target))

(19)最长连续递增序列【录屏讲解】

**视频链接:**录制: 录制3
录制文件:https://meeting.tencent.com/crm/l5nvYy0V5b

题目描述

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。

输入输出描述

输入数组长度n,和n个元素

输出最长连续递增序列的长度

示例

输入:

5

1 3 5 4 7

输出:

3

解释:

最长连续递增序列是 [1,3,5], 长度为3。

尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。

n = int(input())
arr = list(map(int, input().split(" ")))

max_length = 1
cur_length = 1
for i in range(n - 1):
    if arr[i] <= arr[i + 1]:
        cur_length += 1
        if max_length < cur_length:
            max_length = cur_length
    else:
        cur_length = 1
print(max_length)

(20)盛最多水的容器【录屏讲解】

**视频链接:**录制: 录制4
录制文件:https://meeting.tencent.com/crm/NADpAdwy7e

题目描述

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

输入输出描述

输入数组长度n,接下来输入n个元素

输出最大水量

示例1

输入:

9

1 8 6 2 5 4 8 3 7

输出:

49

解释:

[特殊字符] 「Python 编程实战:10 道必刷题解析 + 录屏讲解,从数组操作到矩阵算法!」_第2张图片

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49

#暴力算法
n = int(input())
arr = list(map(int, input().split(" ")))
#计算两条垂线的面积 (right - left) * min(height[right], height[left])

max_s = 0
for i in range(len(arr) - 1):
    for j in range(i + 1, len(arr)):
        s = (j - i) * min(arr[j], arr[i])
        if s > max_s:
            s, max_s = max_s, s
print(max_s)

#双指针法
def solve(arr):
    left = 0
    right = len(arr) - 1
    max_s = 0
    while left < right:
        s = (right - left) * min(arr[right], arr[left])
        if max_s < s:
            max_s, s = s, max_s
        if arr[right] > arr[left]:
            left += 1
        else:
            right -= 1
    return max_s


n = int(input())
arr = list(map(int, input().split(" ")))
print(solve(arr))

你可能感兴趣的:(Python,python,算法,矩阵)