> 技术文档 > Python相应面试题以及试题讲解(循环结构类)

Python相应面试题以及试题讲解(循环结构类)


1.技术面试题

(1)详细描述单调栈的工作原理和应用场景

答:单调栈是栈的变体,核心是栈内元素保持严格单调性(递增或递减),通过入栈时弹出破坏单调性的元素来维护秩序,每个元素仅入栈、出栈一次,时间复杂度 O (n)。

应用场景集中在处理数组中元素的前后关系问题:

下一个 / 上一个更大(小)元素
柱状图最大矩形面积
接雨水问题
股票价格跨度等

其优势是将暴力解法的 O (n²) 优化为 O (n),高效解决区间最值、边界查找类问题

(2)详细描述单调队列的工作原理和应用场景

答:单调队列是一种保持队列内元素单调性(递增或递减)的队列结构,核心是通过移除队列中破坏单调性的元素,确保队首始终是当前区间的最值(最大或最小)。

工作原理:

入队时,移除队列中所有小于(或大于)当前元素的元素(保证单调性),再加入新元素;
队首元素为当前有效区间的最值,若队首超出区间范围则出队;
每个元素仅入队、出队一次,时间复杂度 O (n)。

应用场景:

滑动窗口最值(如长度为 k 的窗口中最大值 / 最小值);
区间内最大 / 小值查询;
优化动态规划中的状态转移(如求子数组最大和等)。

优势:高效解决滑动窗口类问题,避免暴力枚举的 O (nk) 复杂度,降至 O (n)。

2.HR面试题

(1)如果竞争对手用双倍薪资挖你,你会怎么选择?

答:面对竞争对手的双倍薪资邀约,我会从「短期收益」与「长期价值」两个维度理性权衡,而非单纯被薪资数字驱动,具体会关注这几点:

当前平台的不可替代性:比如是否处于核心项目、是否有持续成长的空间(如晋升通道、资源支持)、团队氛围和价值观是否契合 —— 这些是薪资难以量化的隐性价值。
新机会的真实需求:对方开出高薪的核心原因是什么?是急缺人填补空白,还是真正看重我的能力并提供长期发展平台?需明确岗位权责、业务前景,避免陷入 “高薪陷阱”(如过度加班、权责不对等)。
职业规划的匹配度:若新岗位能在专业深度、行业资源或视野上带来突破,且与长期目标一致,会重点考虑;若只是薪资翻倍但重复现有工作、甚至偏离方向,则需谨慎。

最终,薪资是重要参考,但职业发展的可持续性、工作的幸福感,才是更关键的决策依据。

(2)我们觉得你今天表现一般,不符合岗位要求,你有什么想说的?

答:非常感谢您的反馈,这对我来说很重要。如果我的表现没达到预期,一定是在某些方面还有明显不足,我特别希望能知道具体是哪些地方不符合要求 —— 比如是回答的准确性、深度不够,还是逻辑不够清晰,或者没有很好地理解您的需求?

您指出的问题,我会认真记下来并针对性地反思和改进。之后我会更专注于提升自己的专业性,努力达到岗位要求,也希望能有机会继续为您提供更贴合需求的服务。

3.选择题

(1)在Python中,以下哪个不是循环控制语句?

A. break
B. continue
C. pass
D. return

答:C

(2)以下代码的输出结果是什么?

for i in range(5): if i == 3: continue print(i, end=\' \')

A. 0 1 2 3 4
B. 0 1 2 4
C. 0 1 2
D. 3

答:C

(3)完成以下代码,使其能够打印出1到100之间所有的偶数:

for i in range(1, 101): if ______: print(i, end=\' \')

A. i % 2 == 0
B. i % 2 == 1
C. i / 2 == 0
D. i // 2 == 0

答:A

(4)以下代码有一个错误,导致它无法正确计算1到10的和。请选择正确的修改方案:

sum = 0i = 1while i < 10: sum += i i += 1print(sum)

A. 将i < 10改为i <= 10
B. 将i += 1改为i += 2
C. 将sum += i改为sum = sum + i + 1
D. 将i = 1改为i = 0

答:A

(5)以下代码的输出结果是什么?

for i in range(3): for j in range(2): print(f\"({i},{j})\", end=\' \')

A. (0,0) (0,1) (1,0) (1,1) (2,0) (2,1)
B. (0,0) (1,0) (2,0) (0,1) (1,1) (2,1)
C. (0,0) (0,1) (0,2) (1,0) (1,1) (1,2)
D. (0,0) (1,1) (2,2)

答:A

(6)完成以下代码,使其能够打印出斐波那契数列的前10个数:

a, b = 0, 1for _ in range(10): print(a, end=\' \') ______

A. a, b = b, a + b
B. a, b = a + b, b
C. a, b = b, a
D. a, b = a + 1, b + 1

答:A

(7)以下代码的输出结果是什么?

i = 0while i < 5: i += 1 if i == 3: continue print(i, end=\' \')else: print(\"Done\")

A. 1 2 3 4 5 Done
B. 1 2 4 5 Done
C. 1 2 4 5
D. 1 2 Done

答:D

(8)以下代码的输出结果是什么?

for i in range(1, 5): for j in range(1, 5): if i * j > 10: break print(f\"{i}*{j}={i*j}\", end=\" \") print()

A.

1*1=1 1*2=2 1*3=3 1*4=4 2*1=2 2*2=4 2*3=6 2*4=8 3*1=3 3*2=6 3*3=9 3*4=12 4*1=4 4*2=8 4*3=12 4*4=16 

B.

1*1=1 1*2=2 1*3=3 1*4=4 2*1=2 2*2=4 2*3=6 2*4=8 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 

C.

1*1=1 1*2=2 1*3=3 1*4=4 2*1=2 2*2=4 2*3=6 2*4=8 3*1=3 3*2=6 3*3=9 

D.

1*1=1 1*2=2 1*3=3 1*4=4 2*1=2 2*2=4 2*3=6 2*4=8 

答:B

(9)以下代码的输出结果是什么?

for i in range(4): for j in range(4): if (i + j) % 2 == 0: print(\"*\", end=\"\") else: print(\"#\", end=\"\") print()

A.

****####****####

B.

*#*##*#**#*##*#*

C.

*#*#*#*#*#*#*#*#

D.

****************

答:C

(10)以下代码的输出结果是什么?

count = 0for i in range(1, 5): for j in range(1, 5): for k in range(1, 5): if i != j and j != k and i != k: count += 1print(count)

A. 24
B. 36
C. 60
D. 64

答:A

4.问答题

(1)Python中有哪几种基本的循环结构?请简要说明它们的语法和适用场景。

答:Python 中有两种基本循环结构:

for 循环
语法:
python
运行
for 变量 in 可迭代对象:
循环体

适用场景:遍历已知序列(如列表、字符串、range()),适合固定次数的循环。
while 循环
语法:
python
运行
while 条件:
循环体

适用场景:根据条件动态控制循环次数(如用户输入验证、游戏主循环)。

关键区别:

for 适用于已知迭代次数或遍历集合;
while 适用于条件驱动(条件为真时持续执行)

(2)Python中有哪些循环控制语句?它们各自的作用是什么?请给出示例说明。

答:Python 中有三种循环控制语句,用于改变循环的执行流程:

break
作用:立即终止整个循环,跳出循环体。
示例:
python
运行
for i in range(5):
if i == 3:
break # 当i=3时,终止整个循环
print(i) # 输出:0 1 2

continue
作用:跳过当前循环的剩余代码,直接进入下一次迭代。
示例:
python
运行
for i in range(5):
if i == 3:
continue # 当i=3时,跳过后续代码,继续下一次循环
print(i) # 输出:0 1 2 4

else 子句(循环后执行)
作用:循环正常结束(未被 break 中断)时执行 else 块。
示例:
python
运行
for i in range(3):
print(i) # 输出:0 1 2
else:
print(“循环正常结束”) # 执行此语句

总结:

语句作用执行时机
break终止整个循环满足条件时立即跳出循环
continue跳过当前迭代,继续下一次满足条件时跳过剩余循环代码
else循环正常结束后执行循环未被 break 中断时触发

(3)在Python的for循环中,range()函数扮演着重要角色。请详细说明range()函数的语法、参数含义和使用方法,并给出至少3个不同用法的示例。

答:生成连续整数(默认起始 0,步长 1):
python
运行
for i in range(5):
print(i) # 输出:0, 1, 2, 3, 4

指定起始和终止值(步长 1):
python
运行
for i in range(2, 6):
print(i) # 输出:2, 3, 4, 5

指定步长(间隔)(如偶数序列):
python
运行
for i in range(0, 10, 2):
print(i) # 输出:0, 2, 4, 6, 8

递减序列(步长为负数):
python
运行
for i in range(5, 0, -1):
print(i) # 输出:5, 4, 3, 2, 1

遍历列表索引(结合 len()):
python
运行
fruits = [‘apple’, ‘banana’, ‘cherry’]
for i in range(len(fruits)):
print(f\"索引 {i}: {fruits[i]}\")

关键点
左闭右开:range(start, stop) 包含 start,但不包含 stop。
步长不能为 0:否则会引发 ValueError。
高效性:range 返回的是惰性对象(节省内存),转换为列表需显式调用 list(range(…))。

(4)什么是嵌套循环?请解释嵌套循环的工作原理。

答:嵌套循环是指在一个循环内部包含另一个循环的结构,外层循环控制内层循环的执行次数,内层循环作为外层循环体的一部分,会被完整执行多次。
工作原理
外层循环启动:外层循环的第一次迭代开始。
内层循环完整执行:内层循环从第一次迭代到最后一次迭代完整运行(遍历所有可能的情况)。
外层循环推进:内层循环结束后,外层循环进入下一次迭代,重复步骤 2。
终止条件:直到外层循环的所有迭代完成,整个嵌套循环才结束。

简言之,外层循环每执行一次,内层循环会执行完整一轮,类似 “大循环套小循环”,总执行次数为外层循环次数 × 内层循环次数。

(5)编写代码,判断两个矩形的关系

题目描述

判断两个矩形之间的关系:包含,重叠,相离

Python相应面试题以及试题讲解(循环结构类)

输入输出描述

输入两行,每行四个数据,分别是矩形的中心坐标x、y和矩形的宽、高

输出两者的关系

示例1

输入:

2.5 4 2.5 43

1.5 5 0.5 3

输出:

包含

示例2

输入:

1 2 3 5.5

3 4 4.5 5

输出:

重叠

示例3

输入:

1 2 3 3

40 45 3 2

输出:

相离

答:

# 在此写入你的代码def get_rect_coordinates(x, y, width, height): \"\"\"计算矩形的四个顶点坐标\"\"\" half_width = width / 2 half_height = height / 2 left = x - half_width right = x + half_width top = y + half_height bottom = y - half_height return left, right, top, bottomdef check_relationship(rect1, rect2): \"\"\"判断两个矩形的关系\"\"\" left1, right1, top1, bottom1 = rect1 left2, right2, top2, bottom2 = rect2 # 判断是否相离 if (right1 < left2 or left1 > right2 or top1 < bottom2 or bottom1 > top2): return \"相离\" # 判断是否包含 if (left1 <= left2 and right1 >= right2 and top1 >= top2 and bottom1 <= bottom2): return \"包含\" if (left2 <= left1 and right2 >= right1 and top2 >= top1 and bottom2 <= bottom1): return \"包含\" # 否则为重叠 return \"重叠\"# 读取输入rect1_info = list(map(float, input().split()))rect2_info = list(map(float, input().split()))# 计算矩形坐标rect1 = get_rect_coordinates(*rect1_info)rect2 = get_rect_coordinates(*rect2_info)# 判断关系并输出结果relationship = check_relationship(rect1, rect2)print(relationship)**6)编写代码,打印如下数字图案**```python 1  121 12421 1 248421 1248168421 12481632168421124816326432168421

答:

# 在此写入你的代码def print_pattern(rows): for i in range(rows): # 计算当前行的数字列表 nums = [2**j for j in range(i+1)] nums += [2**j for j in range(i-1, -1, -1)] # 转换为字符串并连接 line = \'\'.join(map(str, nums)) # 计算前导空格数 leading_spaces = (rows - i - 1) * 4 # 每个缩进4个空格 # 打印完整行 print(\' \' * leading_spaces + line)# 打印7行图案print_pattern(7)**7)编写代码,打印如下星星图案**```python * *** ***** **************** ******* ***** *** *

答:

def print_diamond(n): # 上半部分(包括中间行) for i in range(n): spaces = n - i - 1 stars = 2 * i + 1 print(\' \' * spaces + \'*\' * stars) # 下半部分(不包括中间行) for i in range(n-2, -1, -1): spaces = n - i - 1 stars = 2 * i + 1 print(\' \' * spaces + \'*\' * stars)# 打印9行的菱形(n=5)print_diamond(5)**8)编写代码,求最小公倍数****题目描述**输入两个正整数,计算其最小公倍数,例如42的最小公倍数是435的最小公倍数是15**输入输出描述**输入两个正整数输出最小公倍数**示例1**> 输入:>> 3 9>> 输出:>> 9**示例2**> 输入:>> 4 6>> 输出:>> 12答:```python# 在此写入你的代码def gcd(a, b): \"\"\"计算最大公约数\"\"\" while b: a, b = b, a % b return adef lcm(a, b): \"\"\"计算最小公倍数\"\"\" return a * b // gcd(a, b)# 读取输入a, b = map(int, input().split())# 计算并输出最小公倍数print(lcm(a, b))