【技术面试提+HR面试题】Python中循环与循环嵌套的基础知识以及Python中循环的基础编程题
1.技术面试题
(1)详细描述单调栈的工作原理和应用场景
答:首先明确什么是单调栈:单调栈是一种特殊的栈数据结构,其核心特性是栈内元素始终保持严格的单调性(递增或递减)。这种特性使得它在解决一些与 “寻找下一个更大 / 更小元素” 相关的问题时,能显著提升效率,通常可将时间复杂度从暴力解法的 O (n²) 优化至 O (n)。
工作原理:把调用函数想成 “叠盘子”:每次用新函数,就把盘子放最上面;函数执行完,就从最上面拿走盘子,底下的接着用
应用场景:就像算数学题的步骤记录:例如做 “2 + (3 - 1)” 这样的题,先算括号里 “3 - 1”(把这一步压栈),算完得到 2 ,弹出栈,再算 “2 + 2” ,就像用栈记住分步计算的顺序,不会乱套 。
(2)详细描述单调队列的工作原理和应用场景
答:明确什么是单调队列:简单说,单调队列就是一个排好固定顺序的队伍,新来的人会把破坏顺序的人请出去,自己再站进来
工作原理:单调队列本质是一种特殊的队列结构,其核心特性是队列中的元素始终保持单调递增或递减。与普通队列不同,它在插入新元素时会动态调整队列结构,以维持单调性。
应用场景:
滑动窗口最值:快速求固定窗口内的最大 / 最小值(如 LeetCode 239 题)。
优化动态规划:将区间最值查询的时间复杂度从 O (n²) 降至 O (n)。
邻接元素查找:找每个元素左右第一个更大 / 更小的元素
2.HR面试题
(1)如果竞争对手用双倍薪资挖你,你会怎么选择?
答:明确HR提这个问题的考察点:
忠诚度与稳定性:看你会不会因短期高薪轻易 “跳槽”,判断你对现有(目标)工作的长期投入意愿。
职业价值观:想了解你更看重薪资,还是平台、成长、团队契合度等其他职场要素。
抗压与判断:考察面对诱惑时的思考逻辑,能否理性权衡利弊,而非冲动做决定。
正面回答:“首先会很感谢竞争对手对我的认可,我认为工作除了薪资,在职业发展、团队匹配度等问题上也是一个非常重要的考量点。如果现在的工作(或贵公司)工作氛围、成长空间,团队和业务方向特别吸引我,有更好的平台能让我持续学到东西、有我认同的发展方向,双倍薪资也不会让我轻易离开。”
(2)我们觉得你今天表现一般,不符合岗位要求,你有什么想说的?
答:明确HR提这个问题的考察点:
1、看你会不会因否定而情绪崩溃(抗压);
2、能否客观看待自己的不足(自我认知);
3、面对拒绝时是否依然保持礼貌、理性(职业素养)。
正面回答:“谢谢您告诉我这个结果,虽然有点小失落,但特别感谢您和团队花时间给我机会,也理解岗位有更合适的人选。如果方便的话,想请教您:我今天哪些地方没达到要求呢?比如是不是某个问题回答得不够清楚,或者哪些能力和岗位不太匹配?知道了这些,以后我也能针对性改进,特别感谢,不管结果怎样,今天的沟通让我对贵公司和这个岗位有了更多了解,以后如果有更适合我的机会,我还会努力争取的,祝您工作顺利
3.选择题
(1)在Python中,以下哪个不是循环控制语句?
A. break
B. continue
C. pass
D. return
答:D,break是用于跳出循环的语句
(2)以下代码的输出结果是什么?
for i in range(5):if i == 3:continueprint(i, end=' ')
A. 0 1 2 3 4
B. 0 1 2 4
C. 0 1 2
D. 3
答:B,原因:for i in range(5):中的(5)表示[0,4]这样一个取值范围,if i ==3时则跳出本次循环,接着执行下一轮循环。
(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 = 0 i = 1 while i < 10:sum += ii += 1 print(sum)
A. 将i < 10
改为i <= 10
B. 将i += 1
改为i += 2
C. 将sum += i
改为sum = sum + i + 1
D. 将i = 1
改为i = 0
答:A,计算1到10的和,但代码中没有取到10,因此将i < 10
改为i <= 10
即可
(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,首先从内层循环开始看起,for j in range(2)中(2)表示取值为0,1。for i in range(3)中(3)表取值为0,1,2。f"({i},{j})"表示将i与j的值以(i,j)形式输出。
(6)完成以下代码,使其能够打印出斐波那契数列的前10个数:
a, b = 0, 1 for _ 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,初始 a = 0
,b = 1
,每次循环要更新 a
和 b
,让 a
变为原来的 b
,b
变为原来 a + b
,即 a, b = b, a + b
便可打印出斐波那契数列的前10个数
(7)以下代码的输出结果是什么?
i = 0 while i < 5:i += 1if i == 3:continueprint(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
答:B,i= 0是循环的初始值,将i=0代入循环,当i小于5时,进行下一步i=i+1,如果i= 3,则跳出本次循环,进入下一次的循环。注意当i=4时进入while循环,经过i+=1后变为5被输出。当i=5进入while后判断i=5结束循环输出Done。
(8)以下代码的输出结果是什么?
for i in range(1, 5):for j in range(1, 5):if i * j > 10:breakprint(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,首先明确i与j 的取值范围都是1到4((1,5)的意思从1开始取值,到五结束但不包括5),i在这里表示行,j表列,便可将C,D排除。当if i * j > 10时便执行break语句结束了循环。因此输出的结构只有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.
**** **** **** ****
答:B,思路跟上一题差不多,i与j的取值都是1到4((1,5)的意思从1开始取值,到五结束但不包括5),然后进入if进行判断,满足if则输出“*”,不满足则执行else输出“#”。
(10)以下代码的输出结果是什么?
count = 0 for 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 += 1 print(count)
A. 24
B. 36
C. 60
D. 64
答:D,
4.问答题
(1)Python中有哪几种基本的循环结构?请简要说明它们的语法和适用场景。
答:for
循环
遍历可迭代对象(如列表、元组、字符串、字典、文件等)。
已知循环次数(如
range()
生成的数字序列)。
while循环
未知循环次数,需根据条件动态判断(如用户输入验证、网络请求重试)。
条件持续满足时执行(如游戏主循环、服务器监听)
(2)Python中有哪些循环控制语句?它们各自的作用是什么?请给出示例说明。
答:1. break
- 终止整个循环
作用:立即退出当前所在的循环,不再执行剩余的迭代。 适用场景:在满足某个条件时提前结束循环(如找到目标值、发生错误)
例如:
for i in range(10):if i == 5:break # 当 i=5 时跳出循环print(i)
2.continue-跳过当前迭代
作用:跳过当前迭代的剩余代码,直接进入下一次迭代。 适用场景:过滤不需要处理的元素(如跳过偶数、无效数据)
例如:
for i in range(10):if i % 2 == 0:continue # 跳过偶数print(i)
3,else-循环正常结束后的操作
作用:当循环正常结束(未被 break
终止)时执行 else
块。 适用场景:验证循环是否成功完成(如搜索失败时的提示)
numbers = [2, 4, 6, 8] target = 5 for num in numbers:if num == target:print(f"找到 {target}")break else: # 循环未被 break 时执行print
(3)在Python的for循环中,range()函数扮演着重要角色。请详细说明range()函数的语法、参数含义和使用方法,并给出至少3个不同用法的示例。
答:一般在使用range()时,主要有三种情况:
range(b):从0到b,步长1
range(a,b):从a到b,步长1
range(a,b,c):从a到b,步长c
单参书形式
for i in range(5):print(i, end=' ')
双参数形式
for i in range(5, 10):print(i, end=' ')
三参数形式:
for i in range(0, 11, 2):print(i, end=' ')
(4)什么是嵌套循环?请解释嵌套循环的工作原理。
答:在 Python 中,嵌套循环指的是在一个循环内部再放置另一个循环。这种结构允许你遍历多维数据结构(如矩阵、嵌套列表)或执行需要多次迭代的复杂任务
嵌套循环的工作原理:
外层循环每执行一次,内层循环会完整执行一轮。
内层循环结束后,外层循环才会进入下一次迭代。
总迭代次数 = 外层循环次数 × 内层循环次数
(5)编写代码,判断两个矩形的关系
题目描述
判断两个矩形之间的关系:包含,重叠,相离
输入输出描述
输入两行,每行四个数据,分别是矩形的中心坐标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
输出:
相离
答:
x1,y1,w1,h1=map(float,input().split(" ")) x2,y2,w2,h2=map(float,input().split(" ")) l1 = x1 - w1 / 2 r1 = x1 + w1 / 2 t1 = x1 - h1 / 2 b1 = x1 + h1 / 2 l2 = x2 - w2 / 2 r2 = x2 + w2 / 2 t2 = x2 - h2 / 2 b2 = x2 + h2 / 2 if (l1 <= l2 and r1 >= r2 and t1 <= t2 and b1 >= b2 or l2 <=l1 and r2 >=r1 and t2 <= t1 and b2 >=b1):print("包含") if(r1 <= l2 or l1 >= r2 or b1 <= t2 or t1 >=b2):print("重叠") if(r1 <=l2 or l1 >= r2 or b1 <= t2 or t1 >= b2):print("相离")
(6)编写代码,打印如下数字图案
11 2 11 2 4 2 11 2 4 8 4 2 11 2 4 8 16 8 4 2 11 2 4 8 16 32 16 8 4 2 1 1 2 4 8 16 32 64 32 16 8 4 2 1
答:
n = 7 for i in range(1,8):for k in range(7-i):print(" ",end =" ")for j in range(i):print(2**j,end = " ")for j in range(i - 2, -1, -1):print(2**j,end = " ")print( )
(7)编写代码,打印如下星星图案
**************** *************************
答:
n = 9 for i in range(1, n+1):for k in range(abs(i-(n + 1) // 2)):print(" ",end='')for j in range(n - 2*(abs(i-(n+1) // 2))):print("*",end='')print( )
(8)编写代码,求最小公倍数
题目描述
输入两个正整数,计算其最小公倍数,例如4和2的最小公倍数是4,3和5的最小公倍数是15
输入输出描述
输入两个正整数
输出最小公倍数
示例1
输入:
3 9
输出:
9
示例2
输入:
4 6
输出:
12
答:
num1, num2 = map(int, input().split()) def gcd(a, b):while b:a, b = b, a % breturn a lcm = num1 * num2 // gcd(num1, num2) print(lcm)