python test10

63 阅读4分钟

# 题目 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))


# 题目 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))

# 题目 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))

# 题目 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()

# 题目 5:超市商品销售数据分析
# “超市销售数据.csv” 包含字段:“日期”“商品类别”“商品名称”“销售数量”“单价 (元)”“会员等级 (普通 / 银卡 / 金卡)”。请使用 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()

运行1.png

运行2.png

运行3.png