【Python练习四】Python 算法与进阶特性实战:数组、序列化与位运算专项练习(3道经典练习带你巩固基础——看完包会)

第一题

题目:

给定一个包含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结果")

运行结果:


相关推荐
报错小能手17 分钟前
深入理解 Linux 虚拟内存管理
开发语言·操作系统
FateRing35 分钟前
vscode插件fail to fecth
ide·vscode·编辑器
和沐阳学逆向39 分钟前
我现在怎么用 CC Switch 管中转站,顺手拿 Codex 举个例子
开发语言·javascript·ecmascript
小仙女的小稀罕41 分钟前
听不清重要会议录音急疯?这款常见AI工具听脑AI精准转译
开发语言·人工智能·python
书到用时方恨少!1 小时前
Python random 模块使用指南:从入门到精通
开发语言·python
第一程序员1 小时前
Python 4.0正式发布:新特性与学习建议
python·github
客卿1231 小时前
牛客刷题--找数字-- 字符串检测-字符串 双指针
java·开发语言
IAUTOMOBILE2 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
威联通安全存储2 小时前
破除“重前端、轻底层”的数字幻象:如何夯实工业数据的物理底座
前端·python
Amour恋空2 小时前
Java多线程
java·开发语言·python