目录

  • 编程题
    • 1.字典中保存了一些股票代码(键)及价格(值),用一行代码找出价格最高的股票,输出股票代码。(5分)
    • 2.字典中保存了一些股票代码(键)及价格(值),用一行代码对字典按股票价格从高到低进行排序,输出股票代码的列表。(5分)
    • 用pandas解决问题1,2
    • 3.设计一个函数,生成指定长度的验证码,验证码由大小写英文字母和数字构成。(10分)
    • 4. 设计一个函数,统计字符串中英文字母和数字各自出现的次数以二元组形式返回。(10分)
    • 5. 设计一个函数,统计一个字符串中出现频率最高的字符及其出现次数,以二元组形式返回,注意频率最高的字符可能不止一个。(10分)
      • 相关题目 :力扣 217 ([题目链接](https://leetcode-cn.com/problems/contains-duplicate/))
    • 6. 列表中有1000000个元素,取值范围是[1000, 10000),设计一个函数返回列表中的重复元素,请将函数的执行效率考虑进去。(10分)
  • 数据库
    • 1. 有如下所示的学生表(tb_student)和近视表(tb_myopia),查询没有近视的学生的姓名。(10分)(类似题目力扣183)
    • 2. 有如下所示的员工表(tb_emp)和部门表(tb_dept),查询每个部门工资(sal)前三高的员工,要求使用窗口函数。(10分)(力扣185题)
    • 3. 有如下所示的表格(tb_sales),要求查出如表(tb_result)所示的结果。(10分)
    • 4.有如下所示的表格(tb_record),其中第二列(income)代表每个人的收入,统计收入的众数。(10分)
    • 5.有如下所示的表格(tb_login_log),统计连续三天有登录行为的用户(user_id),要求使用窗口函数实现。(10分)

编程题

prices = {'AAPL': 191.88,'GOOG': 1186.96,'IBM': 149.24,'ORCL': 48.44,'ACN': 166.89,'FB': 208.09,'SYMC': 21.29
}

1.字典中保存了一些股票代码(键)及价格(值),用一行代码找出价格最高的股票,输出股票代码。(5分)

max(prices,key = lambda x : prices[x]) # 'GOOG'
max(prices,key = prices.get) # 'GOOG'

2.字典中保存了一些股票代码(键)及价格(值),用一行代码对字典按股票价格从高到低进行排序,输出股票代码的列表。(5分)

sorted(prices,key = lambda x:prices[x],reverse = True) # ['GOOG', 'FB', 'AAPL', 'ACN', 'IBM', 'ORCL', 'SYMC']
# reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
sorted(prices,key = prices.get) # ['SYMC', 'ORCL', 'IBM', 'ACN', 'AAPL', 'FB', 'GOOG']

用pandas解决问题1,2

import numpy as np
import pandas as pddf = pd.DataFrame(data = prices.values(),index = prices.keys() ,columns = ['prices'])# 1
df.prices.nlargest(1).index # Index(['GOOG'], dtype='object')# 2
df.prices.sort_values(ascending = False).index # Index(['GOOG', 'FB', 'AAPL', 'ACN', 'IBM', 'ORCL', 'SYMC'], dtype='object')

3.设计一个函数,生成指定长度的验证码,验证码由大小写英文字母和数字构成。(10分)

笨方法:先列举出大小写英文字母和数字,根据指定长度随机数生成索引组成验证码

import random
list1 = ['a','b','c','d','e','f','g','h','i','g','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','G','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0']
length = len(list1)
# print(length)
def func_1(n):res = []for _ in range(n):res.append(list1[random.randint(0,length)])return ''.join(res)print(func_1(10))

参考答案:直接调用string中的字母和数字列表,用random.choices选择指定长度的验证码

import string
all_chars = string.ascii_letters + string.digitsdef random_code(length = 4):return ''.join(random.choices(all_chars,k=length))

注意:因为修改的是命名变量,所以修改变量默认参数值的时候需要写”变量名 = 设定值“

for _ in range(10):print(random_code(length = 7))
"""
LxTjoyk
DK4wI9Q
ASc2jB4
r61h4VY
8vilgaR
mMbxDAq
aY6EoRo
Mvd50Pd
y2kFI9W
96fFYhl
"""

4. 设计一个函数,统计字符串中英文字母和数字各自出现的次数以二元组形式返回。(10分)

利用正则表达式解决问题

import re
def func_2(data):length = len(data)num = re.sub(r'\D',"",data) # 将非数字的字符替换为空字符串return length-len(num),len(num)data2 = 'abc23543RFGV'
print(func_2(data2)) # (7, 5)

参考答案:定义两个计数器,分别计数字母,数字

def count_(content:str):letters_count,num_count = 0,0for x in content:if 'a' <= x <= 'z' or 'A' <= x <= 'Z':letters_count+=1if  '0' <= x <= '9':num_count+=1return letters_count,num_countprint(count_('abc23543RFGV')) # (7, 5)

5. 设计一个函数,统计一个字符串中出现频率最高的字符及其出现次数,以二元组形式返回,注意频率最高的字符可能不止一个。(10分)

参考答案:

def find_highest_freq(content:str):info={}for ch in content:info[ch] = info.get(ch,0) + 1 # 挨个获取字符串的每个字符,以字符为键获取对应的值,值+1 更新字典相应键对应的值max_count = max(info.values())return [key for key,value in info.items() if value == max_count],max_count# 字典.get(key,默认值) - 获取字典中指定key对应的值,key不存在返回默认值

验证

find_highest_freq('aabbccaacc') # (['a', 'c'], 4)
相关题目 :力扣 217 (题目链接)
class Solution:def containsDuplicate(self, nums: List[int]) -> bool:haxi = {}for x in nums:haxi[x] = haxi.get(x,0)+1if haxi[x]>=2: return Truereturn False

6. 列表中有1000000个元素,取值范围是[1000, 10000),设计一个函数返回列表中的重复元素,请将函数的执行效率考虑进去。(10分)

参考答案:以空间换时间

def find_duplicates(nums):counters = [0]*10000  # 创建一个长度为10000,元素为0的数组,数组下标对应的数值为该下标值在给定数组中的出现次数for num in nums:counters[num] += 1 # 取出每个数,修改计数数组相应下标的值加1return [index for index,item in enumerate(counters) if item >1] # 返回计数数组中,值>1的下标值

验证

find_duplicates([1111,1111,1112,1113,1112]) # [1111 , 1112]

数据库

1. 有如下所示的学生表(tb_student)和近视表(tb_myopia),查询没有近视的学生的姓名。(10分)(类似题目力扣183)

#
# tb_student
# +---------+-----------+
# | stu_id  | stu_name  |
# +---------+-----------+
# | 1       | Alice     |
# | 2       | Bob       |
# | 3       | Jack      |
# | 4       | Jerry     |
# | 5       | Tom       |
# +---------+-----------+
#
# tb_myopia
# +------+------------+
# | mid  | stu_id     |
# +------+------------+
# | 1    | 3          |
# | 2    | 2          |
# | 3    | 5          |
# +------+------------+

建表

create table tb_student
(
stu_id int unsigned auto_increment,
stu_name varchar(20) not null ,
primary key (stu_id)
);create table tb_myopia
(
`mid` int unsigned auto_increment,
stu_id int not null,
primary key (`mid`)
);insert into tb_student (stu_id,stu_name)
values
(1,'Alice'),
(2,'Bob'),
(3,'Jack'),
(4,'Jerry'),
(5,'Tom');insert into tb_myopia (`mid`,stu_id)
values
(1,3),
(2,2),
(3,5);

法一:子查询 + not in
思路:选择 stu_id 不在近视表中的学生姓名

select stu_name from tb_student
where stu_id not in (select stu_id from tb_myopia);

法二:左外连接
思路:最终选择的是左表有的,右表没有的,选择左外连接,条件where mid is null / where stu_id is null 都可以

select stu_name from tb_student t1 left join tb_myopia t2 on t1.stu_id=t2.stu_id where mid is null;

select stu_name from tb_student t1 left join tb_myopia t2 on t1.stu_id=t2.stu_id where t2.stu_id is null;

2. 有如下所示的员工表(tb_emp)和部门表(tb_dept),查询每个部门工资(sal)前三高的员工,要求使用窗口函数。(10分)(力扣185题)

#
# tb_emp
# +-----+--------+--------+--------+
# | eno | ename  | sal    |  dno   |
# +-----+--------+--------+--------+
# | 1   | Alice  | 85000  |  1     |
# | 2   | Amy    | 80000  |  2     |
# | 3   | Bob    | 65000  |  2     |
# | 4   | Betty  | 90000  |  2     |
# | 5   | Jack   | 69000  |  1     |
# | 6   | Jerry  | 85000  |  1     |
# | 7   | Martin | 72000  |  2     |
# | 8   | Vera   | 75000  |  1     |
# +-----+--------+--------+--------+
#
# tb_dept
# +----+-------+
# | id | name  |
# +----+-------+
# | 1  | R&D   |
# | 2  | Sales |
# +----+-------+

建表

create table tb_emp
(eno int unsigned auto_increment,ename varchar(20) not null,sal int not null,dno int not null,primary key (eno)
);create table tb_dept
(id int not null,name varchar(20)
);insert into tb_emp (eno,ename,sal,dno)
values
(1,'Alice',85000,1),
(2,'Amy',80000,2),
(3,'Bob',65000,2),
(4,'Betty',90000,2),
(5,'Jack',69000,1),
(6,'Jerry',85000,1),
(7,'Martin',72000,2),
(8,'Vera',75000,1);insert into tb_dept (id,name)
values
(1,'R&D'),
(2,'Sales');

思路:窗函数+子查询

select name `Department`,ename `Employee`,sal `Salary`
from
(select name,ename,sal,dense_rank() over (partition by id order by sal desc) as rnfrom tb_emp t1, tb_dept t2where t1.dno = t2.id
) temp
where rn<=3;

中间过程(子查询):

select name,ename,sal,
dense_rank() over (partition by id order by sal desc) as rn
from tb_emp t1, tb_dept t2
where t1.dno = t2.id;

3. 有如下所示的表格(tb_sales),要求查出如表(tb_result)所示的结果。(10分)

# tb_sales
# +------+---------+--------+
# | year | quarter | amount |
# +------+---------+--------+
# | 2020 |   2     |   11   |
# | 2020 |   2     |   12   |
# | 2020 |   3     |   13   |
# | 2020 |   3     |   14   |
# | 2020 |   4     |   15   |
# | 2021 |   1     |   16   |
# | 2021 |   1     |   17   |
# | 2021 |   2     |   18   |
# | 2021 |   3     |   19   |
# | 2021 |   4     |   18   |
# | 2021 |   4     |   17   |
# | 2021 |   4     |   16   |
# | 2022 |   1     |   15   |
# | 2022 |   1     |   14   |
# +------+---------+--------+
#
# tb_result
#
# +------+--------+--------+--------+--------+
# | year |   Q1   |   Q2   |   Q3   |   Q4   |
# +------+--------+--------+--------+--------+
# | 2020 |   0    |   23   |   27   |   15   |
# | 2021 |   33   |   18   |   19   |   51   |
# | 2022 |   29   |   0    |   0    |   0    |
# +------+--------+--------+--------+--------+

建表:

create table tb_sales
(year int not null,quarter int not null,amount int not null
);delete from tb_sales;insert into tb_sales
values
(2020,2,11),
(2020,2,12),
(2020,3,13),
(2020,3,14),
(2020,4,15),
(2021,1,16),
(2021,1,17),
(2021,2,18),
(2021,3,19),
(2021,4,18),
(2021,4,17),
(2021,4,16),
(2022,1,15),
(2022,1,14);

思路:聚合函数 + (case when then else end)
宽表变窄表

select year,sum(case quarter when 1 then amount else 0 end) as 'Q1', sum(case quarter when 2 then amount else 0 end) as 'Q2', sum(case quarter when 3 then amount else 0 end) as 'Q3', sum(case quarter when 4 then amount else 0 end) as 'Q4'
from tb_sales
group by year;

4.有如下所示的表格(tb_record),其中第二列(income)代表每个人的收入,统计收入的众数。(10分)

# tb_record
# +--------+--------+
# | name   | income |
# +--------+--------+
# | Alice  | 85000  |
# | Amy    | 65000  |
# | Bob    | 65000  |
# | Betty  | 90000  |
# | Jack   | 82000  |
# | Jerry  | 65000  |
# | Martin | 82000  |
# | Vera   | 85000  |
# +--------+--------+

建表

create table tb_record
(name varchar(20) not null,income int unsigned not null
);insert into tb_record (`name` , income)
values
('Alice',85000),
('Amy',65000),
('Bob',65000),
('Betty',90000),
('Jack',82000),
('Jerry',65000),
('Martin',82000),
('Vera',85000);

思路:ALL: 与子查询返回的所有值比较为true 则返回true

select income from tb_record group by income
having count(*) >= all(select count(*) from tb_record group by income);

5.有如下所示的表格(tb_login_log),统计连续三天有登录行为的用户(user_id),要求使用窗口函数实现。(10分)

建表

create table tb_login_log
(user_id varchar(10) not null,login_date date not null
);insert into tb_login_log(user_id,login_date)
values
('A','2019-09-02'),
('A','2019-09-03'),
('A','2019-09-04'),
('B','2018-11-25'),
('B','2018-12-31'),
('C','2019-01-01'),
('C','2019-04-04'),
('C','2019-09-03'),
('C','2019-09-04'),
('C','2019-09-05');

思路:窗函数 + 子查询
补充:如果给的明细时间可以先转换成年月日
DATE() 函数返回日期或日期/时间表达式的日期部分。

语法

select distinct user_id
from (select user_id,login_date,row_number() over (partition by user_id order by login_date) as rnfrom tb_login_log
) temp
group by user_id,subdate(login_date,rn)
having count(*) >= 3;

编程题目+数据库题目总结(3)相关推荐

  1. java面向对象编程考试题,202514HJava面向对象编程答案试题题目及答案,期末考试题库,章节测验答案...

    202514HJava面向对象编程答案试题题目及答案,期末考试题库,章节测验答案 更多相关问题 导游人员在服务过程中,不得().A.向游客兜售物品 B.向游客购买物品C.接受游客给予小费 D.欺 &l ...

  2. 高中生兴趣班c语言,C语言电脑编程兴趣班测试题目资料.doc

    精.选 少年宫电脑编程兴趣班测试题目 竞赛时间:2011年8月21日上午8:00-10:00 题目一览表 题目名称 歌手统分 银行密码 模拟开关 程序文件 score password moni 输入 ...

  3. [译] Facebook杯2013年编程挑战赛——预选赛题目及答案

    <[译] Facebook杯2013年编程挑战赛--预选赛题目及答案>,作者:爷爷泡的茶,原文链接:http://www.cnblogs.com/newyorker/archive/201 ...

  4. LeetCode数据库题目1-123

    LeetCode数据库题目1-123 175. 组合两个表 难度简单 SQL架构 表1: Person +-------------+---------+ | 列名 | 类型 | +--------- ...

  5. 在电脑测试c语言编程,C语言电脑编程兴趣班测试题目

    <C语言电脑编程兴趣班测试题目>由会员分享,可在线阅读,更多相关<C语言电脑编程兴趣班测试题目(3页珍藏版)>请在人人文库网上搜索. 1.少年宫电脑编程兴趣班测试题目竞赛时间: ...

  6. MYSQL将一个人的性别改为女_力扣数据库题目627变更性别

    力扣数据库题目627变更性别 给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值.交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然).要求只使用一个更新 ...

  7. (转)Facebook杯2013年编程挑战赛——预选赛题目及答案

      (转)Facebook杯2013年编程挑战赛--预选赛题目及答案 转自:http://www.cnblogs.com/newyorker/archive/2013/01/31/2886278.ht ...

  8. 数据库题目 - 第二高的薪水

    目录 1.题目名 2.题目内容 3 解答 1.题目名 题目名:第二高的薪水 难度:简单 来源:力扣(LeetCode) 2.题目内容 编写一个 SQL 查询,获取 Employee 表中第二高的薪水( ...

  9. 20201217网警考试题目及题目源码(百度云网盘下载链接)

    20201217网警考试题目及题目源码(百度云网盘下载链接) 解题答案视频教程请关注"极客易先生"微信公众号 链接:https://pan.baidu.com/s/1pzimgPk ...

最新文章

  1. linux 下面安装mysql
  2. PHP iconv()函数转字符编码的问题(转)
  3. C实现socket编程
  4. 「Python-StandardLib」第十六章:并发执行( Cocurrent Executing,线程、多线程队列、子进程)
  5. 使用asyncScheduler进行Observable的延迟subscribe
  6. html实现websocket协议,HTML5实现WebSocket协议原理浅析
  7. php jpeg不支持,php jpeg不支持怎么办
  8. unity动画实现物体颜色闪烁
  9. 魔域手游如何修改服务器id,魔域互通端游手游架设
  10. django使用kindeditor上传图片问题
  11. 物联网毕业设计 车牌识别系统 stm32
  12. 计算机驱动程序的安装过程,电脑怎么安装驱动程序
  13. R代码学习(5)——数据类型(字符串)
  14. C++设计:关于CMatrix类的相关操作
  15. free-excel (wps版) | 第十章Excel看板
  16. 计算机应用基础答案2010,计算机基础(Excel2010)试题及答案
  17. 浅谈Visitor访问者模式
  18. 腾讯QQ2007II Beta2传美版v2.3
  19. 计算机专业英语选词填空,专业英语考试+单词翻译+单项选择+选词填空+成成呕心沥血之作.doc...
  20. 景联文科技提供一站式智能安防数据采集标注解决方案

热门文章

  1. 计算机技术生活应用论文,计算机网络技术生活应用论文
  2. MATLAB工具箱,应用程序,软件和资源的精选清单
  3. 验证darknet中前处理做图像缩放(双线性内插值法)scale的算法效果
  4. CS1503号错误是什么
  5. rda分析怎么做_数量生态学笔记||冗余分析(RDA)
  6. 使用京东云免费云主机搭建CentOS
  7. linux查看进程和端口信息的命令
  8. Problem 1004: 蛤玮打扫教室(区间覆盖端点记录)
  9. 挣值管理(PV、EV、AC、SV、CV、SPI、CPI、VAC、BAC、ETC、EAC、)公式全集
  10. Vue.js + Vuex + TypeScript 实战项目开发与项目优化