第一题
题目:
给定一个包含n+1个整数的数组nums,其数字在1到n之间(包含1和n),
可知至少存在一个重复的整数 假设只有一个重复的整数,请找出这个重复的数 -- 可以使用多种方式 -异或运算/集合
代码:
python
# 方法1:集合查重(集合元素唯一性)
def findDuplicate1(nums):
num_set = set()
for num in nums:
if num in num_set: # 已存在说明是重复数
return num
num_set.add(num)
return -1 # 防止nums没有重复整数报错
# 方法2:异或运算
def findDuplicate2(nums):
res = 0
# 异或 1~n 的所有数字
for i in range(1,len(nums)):
res ^= i
# 异或数组中所有元素
for num in nums:
res ^= num
return res
# 方法3:排序后相邻比对
def findDuplicate3(nums):
nums.sort() # 排序后重复数会相邻
for i in range(1, len(nums)):
if nums[i] == nums[i-1]:
return nums[i]
return -1
# 测试用例
nums = [1,2,5,6,7,8,4,3,2]
print("集合方法找到重复数:", findDuplicate1(nums))
print("异或方法找到重复数:", findDuplicate2(nums))
print("排序方法找到重复数:", findDuplicate3(nums))
运行结果:

第二题
题目:
编写一个登录功能,使用序列化完成,并使用装饰器完成用户名和密码的记录及每次登录时间
- 1.存储文件中的用户名和密码,使用序列化的形式--对象
- 2.读取文件中的数据-反序列化的对象,
- 3.用户输入登录的账户和密码,检验,完成登录操作
- 4.装饰器记录登录的账户和密码,及登录时间
代码:
python
import pickle
import time
import os
from functools import wraps
# 定义用户数据文件
USER_FILE = "users.pkl"
# 装饰器:记录登录信息到日志
def log_login(func):
@wraps(func)
def wrapper(username, password):
# 获取格式化的登录时间
login_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 追加写入登录日志(包含用户名、密码、登录时间)
with open("login_log.txt", "a+", encoding="utf-8") as f:
f.write(f"用户: {username}, 密码: {password}, 登录时间: {login_time}\n")
return func(username, password)
return wrapper
# 初始化用户数据文件
if not os.path.exists(USER_FILE):
with open(USER_FILE, "wb") as f:
pickle.dump({"admin": "123456"}, f)
# 读取用户数据(反序列化)
def load_users():
with open(USER_FILE, "rb") as f:
return pickle.load(f)
# 保存用户数据(序列化)
def save_users(users):
with open(USER_FILE, "wb") as f:
pickle.dump(users, f)
# 注册功能
def register(username, password):
users = load_users()
if username in users:
print("用户名已存在!")
return False
users[username] = password
save_users(users)
print(f"用户 {username} 注册成功!")
return True
# 登录功能
@log_login
def login(username, password):
users = load_users()
if username in users and users[username] == password:
print(f"用户 {username} 登录成功!")
return True
print("用户名或密码错误!")
return False
# 启动交互界面
while True:
print("\n1. 注册 2. 登录 3. 退出")
choice = input("请选择操作: ")
if choice == "1":
username = input("请输入用户名: ")
password = input("请输入密码: ")
register(username, password)
elif choice == "2":
username = input("请输入用户名: ")
password = input("请输入密码: ")
login(username, password)
elif choice == "3":
break
else:
print("输入错误,请重新选择!")
运行结果:

第三题
题目:
测试位运算符,数字为23和-17的,并详细列出位运算的全过程
代码:
python
a = 23
b = -17
# 打印二进制补码
def print_bin(num, name):
# 获取32位二进制补码(&0xFFFFFFFF确保显示32位)
bin_str = bin(num & 0xFFFFFFFF)[2:].zfill(32)
print(f"{name} ({num}) 的32位二进制补码: {bin_str}")
# 打印原始数字的补码
print_bin(a, "a=23")
print_bin(b, "b=-17")
# 位与运算(对应位都为1则为1)
print("\n1. 位与 &: a & b =", a & b)
print_bin(a & b, "结果")
# 位或运算(对应位有一个为1则为1)
print("\n2. 位或 |: a | b =", a | b)
print_bin(a | b, "结果")
# 异或运算(对应位不同则为1)
print("\n3. 异或 ^: a ^ b =", a ^ b)
print_bin(a ^ b, "结果")
# 取反运算(按位取反,0变1/1变0)
print("\n4. 取反 ~: ~a =", ~a, " ~b =", ~b)
print_bin(~a & 0xFFFFFFFF, "~a结果")
print_bin(~b & 0xFFFFFFFF, "~b结果")
# 左移运算(左移n位,右侧补0)
print("\n5. 左移 <<: a << 2 =", a << 2, " b << 2 =", b << 2)
print_bin(a << 2, "a<<2结果")
print_bin(b << 2, "b<<2结果")
# 右移运算(正数左补0,负数左补1)
print("\n6. 右移 >>: a >> 2 =", a >> 2, " b >> 2 =", b >> 2)
print_bin(a >> 2, "a>>2结果")
print_bin(b >> 2, "b>>2结果")
运行结果:
