1.给定一个包含n+1个整数的数组nums,其数字在1到n之间(包含1和n),
可知至少存在一个重复的整数 假设只有一个重复的整数,请找出这个重复的数 -- 可以使用多种方式 -异或运算/集合
def find_duplicate_set(nums):
"""
利用集合的唯一性找重复数
"""
seen = set()
for num in nums:
if num in seen:
return num
seen.add(num)
return -1
a = [1,2,3,4,5,6,7,8,9,10,5]
print(find_duplicate_set(a))

2.编写一个登录功能,使用序列化完成,并使用装饰器完成用户名和密码的记录及每次登录时间
- 1.存储文件中的用户名和密码,使用序列化的形式--对象
- 2.读取文件中的数据-反序列化的对象,
- 3.用户输入登录的账户和密码,检验,完成登录操作
- 4.装饰器记录登录的账户和密码,及登录时间
import pickle
import time
from datetime import datetime
# 定义文件路径
USER_DATA_FILE = "D:/test/b/user_data.pkl"
LOG_FILE = "D:/test/b/login_log.txt"
# 初始化用户数据(首次运行时创建)
def init_user_data():
"""初始化用户数据,序列化保存到文件"""
# 预设测试用户:{"admin": "123456"}
default_users = {"admin": "123456"}
with open(USER_DATA_FILE, "wb") as f:
pickle.dump(default_users, f)
# 装饰器:记录登录信息(用户名、密码、登录时间)
def login_logger(func):
def wrapper(*args, **kwargs):
# 执行原登录函数,获取登录结果和用户名/密码
username = args[0] if args else kwargs.get("username")
password = args[1] if len(args) >= 2 else kwargs.get("password")
result = func(*args, **kwargs)
# 记录登录信息(无论成功/失败)
login_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_content = f"时间:{login_time} | 用户名:{username} | 密码:{password} | 登录结果:{result}\n"
# 写入日志文件
with open(LOG_FILE, "a", encoding="utf-8") as f:
f.write(log_content)
return result
return wrapper
# 读取用户数据(反序列化)
def load_user_data():
"""读取序列化的用户数据"""
try:
with open(USER_DATA_FILE, "rb") as f:
return pickle.load(f)
except FileNotFoundError:
# 文件不存在则初始化
init_user_data()
return load_user_data()
# 登录函数(带装饰器)
@login_logger
def login(username, password):
"""
登录校验函数
"""
user_data = load_user_data()
if username in user_data and user_data[username] == password:
return "登录成功"
else:
return "登录失败(用户名或密码错误)"
def main():
print("===== 序列化登录系统 =====")
username = input("请输入用户名:").strip()
password = input("请输入密码:").strip()
# 执行登录
result = login(username, password)
print(result)
main()

3.测试位运算符,数字为23和-17的,并详细列出位运算的全过程
(1)转换 23 和 - 17 为二进制补码
23
十进制转二进制:23 = 00010111
补码:00010111
-17
17 的二进制原码(8 位):00010001
17 的反码:符号位不变,其余取反 → 11101110
-17 的补码: 11101110+1 = 11101111
(2)测试所有位运算
按位与(&):23 & -17
23补码: 0001 0111
& -17补码:1110 1111
-----------------
0000 0111 → 十进制7
按位或(|):23 | -17
23补码: 0001 0111
| -17补码:1110 1111
-----------------
1111 1111 → 补码转十进制:全1的8位补码是-1
按位异或(^):23 ^ -17
23补码: 0001 0111
^ -17补码:1110 1111
-----------------
1111 1000 → 补码转十进制:
反码:1111 0111 → 原码:1000 1000 → -8
按位取反(~):~23 和~-17
~23
23 补码:00010111 → 11101000
反码11100111 → 原码10011000 → 十进制 - 24
~-17
补码:11101111 → 00010000
补码转十进制:16
左移(<<):23<<1 和 -17<<1
23<<1
23 补码:00010111 → 左移 1 位:00101110 → 十进制 46
-17<<1
17 补码:11101111 → 左移 1 位:11011110
反码:11011101 → 原码:10100010 → 十进制 - 34
右移(>>):23>>1 和 -17>>1
23>>1
23 补码:00010111 → 右移 1 位:00001011 → 十进制 11
-17>>1
-17 补码:11101111 → 右移 1 位:11110111
反码:11110110 → 原码:10001001 → 十进制 - 9
a = 23
b = -17
print(f"23 & -17 = {a & b}")
print(f"23 | -17 = {a | b}")
print(f"23 ^ -17 = {a ^ b}")
print(f"~23 = {~a}")
print(f"~-17 = {~b}")
print(f"23<<1 = {a << 1}")
print(f"-17<<1 = {b << 1}")
print(f"23>>1 = {a >> 1}")
print(f"-17>>1 = {b >> 1}")


275

被折叠的 条评论
为什么被折叠?



