Python | 练习题<10>

21 阅读6分钟

题目 1:给定一个字符串 s ,请找出其中不含有重复字符的最长子串的长度。

例如:

  • 输入: s = "abcabcbb"
  • 输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

注意 "bca" 和 "cab" 也是正确答案。

def find_longest_substr(s):
    char_set = set() # 初始化空集合,存放窗口内的元素
    left = 0 # 滑动窗口左边界
    max_len = 0 # 记录最大长度,初始化为0

    for right in range(len(s)): # 滑动窗口为右边界
        # 若当前字符已经在窗口中,收缩左边界
        while s[right] in char_set:
            char_set.remove(s[left])  # 剔除掉重复的元素
            left += 1 # 左边界往右滑动一次
        # 将当前字符添加到窗口内
        char_set.add(s[right])
        # 更新最大长度
        max_len = max(max_len, right - left + 1)
    return max_len
s = "abcabcbb"
print(find_longest_substr(s))

运行结果:

111111.png

题目 2:给定一个整数数组 nums ,判断是否存在 三元组 [nums[i], nums[j], nums[k]]

满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。

请返回所有和为 0 且不重复的三元组。

注意: 答案中不可以包含重复的三元组。

例如:

  • 输入:nums = [-1,0,1,2,-1,-4]
  • 输出:[[-1,-1,2],[-1,0,1]]
def three_nums(nums):
    res = set() # 空集合,存放结果
    n = len(nums)
    for i in range(n): # 第一个数
        for j in range(i+1, n): # 第二个数
            for k in range(j+1, n): # 第三个数
                if nums[i] + nums[j] + nums[k] == 0:
                    # 去重操作
                    tmp = tuple(sorted([nums[i], nums[j], nums[k]]))
                    res.add(tmp)
    return res
nums = [-1,0,1,2,-1,-4]
print(three_nums(nums))

运行结果:

2222222.png

题目 3:给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

例如:

  • 输入:nums = [100,4,200,1,3,2]
  • 输出:4
  • 解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
def longest_subNums(nums):
    nums_set = set(nums) # 作为参照
    max_len = 0 # 记录最大长度

    for num in nums:
        if num -1 not in nums_set: # 当前元素num可以作为序列的起点
            current_num = num # 当前数字
            current_len = 1 # 当前长度,初始化为1
            while current_num + 1 in nums_set:
                current_num += 1 # 当前数字往后递增1个单位
                current_len += 1 # 当前长度+1
            # 更新最大长度
            max_len = max(max_len, current_len)
    return max_len
nums = [100,4,200,1,3,2,200]
print(longest_subNums(nums))

运行结果:

333333.png

题目 4:使用 NumPy 和 Matplotlib 绘制一个正弦波和余弦波的图像

要求横坐标为 0 到 2π,每隔 0.1 取一个点,图像中正弦波为蓝色实线,余弦波为红色虚线,并且添加图例、x 轴标签为 'x',y 轴标签为 'y',标题为 'sinx and cosx'。

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 2*np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
plt.plot(x, y_sin, 'b-', label='y=sin(x)')
plt.plot(x, y_cos, 'r--', label='y=cos(x)')
plt.legend()
plt.show()

运行结果:

44444444.png

题目 5:超市商品销售数据分析

“超市销售数据.csv” 包含字段:“日期”“商品类别”“商品名称”“销售数量”“单价 (元)”“会员等级 (普通 / 银卡 / 金卡)”。

请使用 pandas、numpy 和 matplotlib 完成以下任务:

  1. 读取 CSV 文件数据,将 “日期” 转换为 datetime 格式。
  2. 计算每类商品的总销售额(销售数量 × 单价)和平均销售单价。
  3. 按 “会员等级” 分组,统计不同等级会员的总消费金额和平均单次消费金额。
  4. 提取 “日期” 中的月份,绘制每月总销售额的柱状图。
  5. 找出总销售额最高的 5 种商品,用饼图展示它们的销售额占比。

分解代码:

请使用 pandas、numpy 和 matplotlib 完成以下任务

import pandas as pd

1. 读取 CSV 文件数据,将 “日期” 转换为 datetime 格式。

df = pd.read_csv("超市销售数据.csv")
print(df)
df['日期'] = pd.to_datetime(df['日期'])
print(df['日期'].dtype)

运行结果:

11111111111111111.png

2. 计算每类商品的总销售额(销售数量 × 单价)和平均销售单价。

df['总销售额'] = df['销售数量'] * df['单价 (元)']
states = df.groupby("商品类别").agg({"总销售额":"sum", "单价 (元)":"mean"})
print(states)

运行结果:

22222222222222.png

3. 按 “会员等级” 分组,统计不同等级会员的总消费金额和平均单次消费金额。

total_sales = df.groupby("会员等级 (普通/银卡/金卡)")['总销售额'].sum()
total_counts = df.groupby("会员等级 (普通/银卡/金卡)")['销售数量'].sum()
mean_sales = total_sales / total_counts
print(total_sales)
print(mean_sales)

运行结果:

23333333333333333.png

4. 提取 “日期” 中的月份,绘制每月总销售额的柱状图。

df['月份'] = df['日期'].dt.month
total_sales = df.groupby('月份')['销售数量'].sum()
plt.bar(total_sales.index, total_sales)
plt.show()

运行结果:

5555555111111111111.png

5. 找出总销售额最高的 5 种商品,用饼图展示它们的销售额占比。

df = df.sort_values('总销售额', ascending = False)  # 降序排序
top5 = df[:5]['总销售额']
total_sales = df['总销售额'].sum() # 所有商品的总销售额
top5_rate = top5 / total_sales
plt.pie(top5_rate, labels=top5_rate.index)
plt.show()

运行结果:

555555522222222222249.png

完整代码:
# 请使用 pandas、numpy 和 matplotlib 完成以下任务:
import pandas as pd
# 1. 读取 CSV 文件数据,将 “日期” 转换为 datetime 格式。
df = pd.read_csv("超市销售数据.csv")
print(df)
df['日期'] = pd.to_datetime(df['日期'])
print(df['日期'].dtype)

# 2. 计算每类商品的总销售额(销售数量 × 单价)和平均销售单价。
df['总销售额'] = df['销售数量'] * df['单价 (元)']
states = df.groupby("商品类别").agg({"总销售额":"sum", "单价 (元)":"mean"})
print(states)

# 3. 按 “会员等级” 分组,统计不同等级会员的总消费金额和平均单次消费金额。
total_sales = df.groupby("会员等级 (普通/银卡/金卡)")['总销售额'].sum()
total_counts = df.groupby("会员等级 (普通/银卡/金卡)")['销售数量'].sum()
mean_sales = total_sales / total_counts
print(total_sales)
print(mean_sales)

# 4. 提取 “日期” 中的月份,绘制每月总销售额的柱状图。
df['月份'] = df['日期'].dt.month
total_sales = df.groupby('月份')['销售数量'].sum()
plt.bar(total_sales.index, total_sales)
plt.show()

# 5. 找出总销售额最高的 5 种商品,用饼图展示它们的销售额占比。
df = df.sort_values('总销售额', ascending = False)  # 降序排序
top5 = df[:5]['总销售额']
total_sales = df['总销售额'].sum() # 所有商品的总销售额
top5_rate = top5 / total_sales
plt.pie(top5_rate, labels=top5_rate.index)
plt.show()

运行结果:

555555555.png

5555555111111111111.png

555555522222222222249.png