1.给定一个包含n+1个整数的数组nums,其数字在1到n之间(包含1和n),
可知至少存在一个重复的整数 假设只有一个重复的整数,请找出这个重复的数 -- 可以使用多种方式 -异或运算/集合
代码:
python
def find_repeated_num(nums):
n = len(nums) - 1 # n+1个整数的数组nums,范围在1到n之间(包含1和n)
xor_n = 0
xor_nums = 0
# 通过异或1到n中所有数
for i in range(1, n+1):
xor_n ^= i
# 异或数组nums中所有元素
for j in nums:
xor_nums ^= j
# 最终异或结果即为重复数
return xor_n ^ xor_nums
# 测试
nums = [1,2,3,4,5,3,6,7]
print(find_repeated_num(nums)) # 3
运行结果:

2.编写一个登录功能,使用序列化完成,并使用装饰器完成用户名和密码的记录及每次登录时间
-
1.存储文件中的用户名和密码,使用序列化的形式--对象
-
2.读取文件中的数据-反序列化的对象,
-
3.用户输入登录的账户和密码,检验,完成登录操作
-
4.装饰器记录登录的账户和密码,及登录时间
代码:
python
import pickle
import time
# 装饰器:记录登录时间、用户名、密码、结果
def login_log(func):
def wrapper(user, pwd):
# 登录时间
log_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 执行原登录函数,获取结果
res = func(user, pwd)
# 追加写入日志
with open("login_log.txt", "a", encoding="utf-8") as f:
f.write(f"时间:{log_time},用户名:{user},密码:{pwd},结果:{res}\n")
return res
return wrapper
# 序列化/反序列化,读取/初始化用户数据
def get_users():
try:
# 反序列化:读取文件中的用户字典对象
with open("user.pkl", "rb") as f:
return pickle.load(f)
except FileNotFoundError:
# 首次运行无文件,手动输入初始用户信息
print("=== 首次运行 ===")
init_user = input("请设置初始用户名:").strip()
init_pwd = input("请设置初始用户密码:").strip()
# 构造用户对象并序列化存储
init_obj = {init_user: init_pwd}
with open("user.pkl", "wb") as f:
pickle.dump(init_obj, f)
print("用户数据初始化完成\n")
return init_obj
# 登录函数
@login_log
def login(username, password):
users = get_users()
if username not in users:
return "用户名不存在"
elif users[username] == password:
return "登录成功"
else:
return "密码错误"
# 主程序
if __name__ == "__main__":
print("=== 系统登录 ===")
uname = input("请输入用户名:").strip()
pwd = input("请输入密码:").strip()
print("登录结果:", login(uname, pwd))
运行结果:




3.测试位运算符,数字为23和-17的,并详细列出位运算的全过程
代码:
python
a = 23
b = -17
"""
十进制转二进制转补码
a:0001 0111 原
0001 0111 补
b:0001 0001 原
1110 1110 反
1110 1111 补
"""
"""
位与
a:0001 0111
b:1110 1111
&:0000 0111 补
0000 0111 原 = 7
"""
print("a & b:", a & b) # 7
"""
位或
a:0001 0111
b:1110 1111
|:1111 1111 补
1111 1110 反
0000 0001 原 = -1
"""
print("a | b:", a | b) # -1
"""
异或
a:0001 0111
b:1110 1111
^:1111 1000
1111 0111
0000 1000 = -8
"""
print("a ^ b:", a ^ b) # -8
"""
取反
a:0001 0111
~:1110 1000 ==>反:1110 0111 ==>原 0001 1000 = -24
b:1110 1111
~:0001 0000 ==> 16
"""
print("~a:", ~a) # -24
print("~b:", ~b) # 16
"""
左移
a:0001 0111
<<2:0101 1100 = 92
b:1110 1111
<<2:1011 1100 ==>反:1011 1011 ==>原 0100 0100 = -68
"""
print("a<<2:", a << 2) # 92
print("b<<2:", b << 2) # -68
"""
右移
a:0001 0111
>>2:0000 0101 = 5
b:1110 1111
>>2:1111 1011 ==>反:1111 1010 ==>原 0000 0101 = -5
"""
print("a>>2:", a >> 2) # 5
print("b>>2:", b >> 2) # -5
运行结果:
