题目 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 完成以下任务:
- 读取 CSV 文件数据,将 “日期” 转换为 datetime 格式。
- 计算每类商品的总销售额(销售数量 × 单价)和平均销售单价。
- 按 “会员等级” 分组,统计不同等级会员的总消费金额和平均单次消费金额。
- 提取 “日期” 中的月份,绘制每月总销售额的柱状图。
- 找出总销售额最高的 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)
运行结果:
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()
运行结果:
完整代码:
# 请使用 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()
运行结果: