Java经典笔试题—day14
- 🔎选择题
- 🔎编程题
- 🍭计算日期到天数转换
- 🍭幸运的袋子
- 🔎结尾
🔎选择题
(1)定义学生、教师和课程的关系模式 S (S#,Sn,Sd,Dc,SA )(其属性分别为学号、姓名、所在系、所在系的系主任、年龄); C ( C#,Cn,P# )(其属性分别为课程号、课程名、先修课); SC ( S#,C#,G) (其属性分别为学号、课程号和成绩),则该关系为( )
A. 第二范式
B. 第一范式
C. 第三范式
D. BCNF范式
A
范式是符合某一种级别的关系模式的集合
关系数据库中的关系必须满足一定的要求, 满足不同程度要求的为不同范式
- 目前关系数据库有六种范式
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- Boyce-Codd范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF)
- 满足最低要求的范式是第一范式(1NF)
- 在第一范式基础上进一步满足更多要求的称为第二范式(2NF), 其余范式依次类推
一般来说, 数据库只需满足第三范式(3NF)即可第一范式(1NF): 主属性(主键)不为空且不重复, 字段不可再分(存在非主属性对主属性的部份依赖)
第二范式(2NF): 关系模式是第一范式, 且非主键完全依赖于主键
第三范式(3NF): 关系模式是第二范式, 且非主键与非主键之间不存在依赖关系
BCNF: 所有属性都不传递依赖于关系的任何候选键
对于 S 表, 主键为学号
, 非主键为姓名, 所在系, 所在系系主任, 年龄
满足第一范式(主键非空且不重复, 字段不可再分)
满足第二范式(关系模式是第一范式, 且非主键完全依赖于主键)
不满足第三范式(所在系
与所在系系主任
存在依赖关系, 通过所在系
能确定所在系系主任
)
对于 C 表, 主键为课程号
, 非主键为课程名, 先修课
满足第一范式(主键非空且不重复, 字段不可再分)
满足第二范式(关系模式是第一范式, 且非主键完全依赖于主键)
满足第三范式(关系模式是第二范式, 且非主键与非主键之间不存在依赖关系)
对于 SC 表, 主键为学号, 课程号
(联合主键), 非主键为成绩
满足第一范式(主键非空且不重复, 字段不可再分)
满足第二范式(关系模式是第一范式, 且非主键完全依赖于主键)
满足第三范式(关系模式是第二范式, 且非主键与非主键之间不存在依赖关系)
综上所述, 答案为第二范式
(2)下面不属于数据库系统特点的是( )
A. 数据冗余度高
B. 数据具有完整性
C. 数据共享性好
D. 数据独立性高
A
- 数据库系统的特点
- 数据共享性高, 冗余度低
- 具有高度的物理独立性和逻辑独立性
- 整体结构化, 用数据模型描述
- 由数据库系统提供数据安全性, 完整性, 并发控制和恢复能力
(3)将实体-联系模型转换为关系模型时,实体之间多对多联系在关系模型中的实现方式是( )
A. 建立新的关系
B. 建立新的属性
C. 增加新的关键字
D. 建立新的实体
A
- 实体-联系模型, 也成为实体-联系图(ER图)
- ER图包含4个基本部分
- 矩形框: 表示实体的类型
- 菱形框: 表示联系的类型
- 椭圆形框: 表示实体类型和联系类型的属性
- 直线: 联系类型与其涉及的实体类型之间用直线连接
例如每个专业设置多门课程, 某些课程可被多个专业设置
专业(实体)与课程(实体)之间的联系在ER图中表示为多对多, 但在关系模型中, 需要通过中间表(建立新的关系)来表达多对多的关系
(4)关于求和函数,以下说法正确的是()
A. sum返回表达式中所有数的总和,因此只能用于数字类型的列
B. Avg返回表达式中所有数的平均值,可以用于数字型和日期型的列
C. Max和Min可以用于字符型的列
D. Count可以用于字符型的列
A
B. Avg 可以应用于数字型字段(列), 不能应用于日期型字段(列)
C. Max 和 Min 应用于数字型字段(列), 不能应用于字符型字段(列)
D. Count 可以应用于任意类型的字段(列), 但不属于求和函数
(5)有三个关系 R 、 S 和 T 如下:
则由关系 R 和 S 得到关系 T 的操作是( )
A. 自然连接
B. 交
C. 除
D. 并
C
- 自然连接
- 如果关系R与S具有相同的属性B, 且该属性组的值相等时的连接称为自然连接, 结果关系的属性集合为R的属性并上S减去属性B的属性集合.(自然连接也可以看作是在广义笛卡尔积R x S中选出同名属性上符合相等条件元组, 再进行投影, 去掉重复的同名属性, 组成新的关系)
- 交
- 取出两个结果集中字段相同的部分
- 除
- 并
- 合并两个结果集中字段相同的部分
(6)设有表示学生选课的三张表,学生S(学号,姓名,性别,年龄,身份证号),课程C(课号,课名),选课SC(学号,课号,成绩),则表SC的关键字(键或码)为( )
A. 课号,成绩
B. 学号,成绩
C. 学号,课号
D. 学号,姓名,成绩
C
SC 表的学号作为外键关联 S 表的主键学号
SC 表的课号作为外键关联 C 表的主键课号
因此, SC 表的主键为学号, 课号(联合主键)
(7)关系数据库所采用的数据存放形式是()
A. 二维表
B. 链表
C. 网状
D. 二叉树
A
关系数据库存放数据形式类似于 Excel, 属于二维表的形式
(8)某关系表有:员工(部门编号,部门名称,员工编号,姓名,性别,年龄),则其主码为()
A. 部门编号、员工编号
B. 员工编号
C. 姓名
D. 部门编号
A
- 判断员工编号是否可以重复
- 员工编号可以重复(需利用其他字段区分是否为同一员工)
类似于 id = 1001, 部门编号分别为 dept = 1 和 dept = 2- 员工编号不可以重复(利用员工编号即可区分是否为同一员工)
类似于 id = 1001, id = 1002- 根据题目, 已经给出部门编号等其他信息, 表明员工编号可以重复
- 综上, 主键为部门编号, 员工编号
(9)在使用 limit 子句时,如果没有足够的行,则:
A. MySQL会报错
B. MySQL将只返回它能返回的那么多行
C. MySQL将不会返回任何行
B
(10)不属于SQL语句的是()
A. SELECT
B. CANCEL
C. UPDATE
D. ALTER
B
A. 查询的关键字
C. 修改的关键字
D. 管理表结构的关键字
🔎编程题
🍭计算日期到天数转换
题目描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
进阶:时间复杂度:O(1) ,空间复杂度:O(1)
输入描述
输入一行,每行空格分割,分别是年,月,日
输出描述
输出是这一年的第几天
解题思路
- 判断 year 是否为闰年
- 注意给出的 month 表示计算到当月的天数, 因此加上给出的 day 即可
//计算日期到天数转换
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int year = scan.nextInt();
int month = scan.nextInt();
int day = scan.nextInt();
calcDay(year, month, day);
}
private static void calcDay(int year,int month,int day) {
// flag --> 判断是否为闰年
boolean flag = false;
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) flag = true;
// month 1 2 3 4 5 6 7 8 9 10 11
int[] days = {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30};
days[1] = flag ? 29 : 28;
int ret = 0;
for(int i = 0; i < month - 1; i++) {
ret += days[i];
}
System.out.println(ret + day);
}
}
📢题目链接
链接:link
🍭幸运的袋子
题目描述
一个袋子里面有n个球,每个球上面都有一个号码(拥有相同号码的球是无区别的)。如果一个袋子是幸运的当且仅当所有球的号码的和大于所有球的号码的积。
例如:如果袋子里面的球的号码是{1, 1, 2, 3},这个袋子就是幸运的,因为1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以适当从袋子里移除一些球(可以移除0个,但是别移除完),要使移除后的袋子是幸运的。现在让你编程计算一下你可以获得的多少种不同的幸运的袋子。
输入描述
第一行输入一个正整数n(n ≤ 1000) 第二行为n个数正整数xi(xi ≤ 1000)
输出描述
输出可以产生的幸运的袋子数
解题思路
以 n = 5, xi 分别为 1, 5, 7, 3, 1为例
- 先进行排序(下面解释)
- 排序后的结果为 1, 1, 3, 5, 7
- 定义 sum = 0(和), mul = 1(乘积), cnt = 0(产生的幸运袋子数)
- 从1, 1 开始
- 判断1, 1, 3 能否构成幸运袋子(√)
- 判断1, 1, 3, 5 能否构成幸运袋子(x)
- 判断1, 1, 5 能否构成幸运袋子(√)
- 判断1, 1, 5, 7 能否构成幸运袋子(x)
- 判断1, 1, 7 能否构成幸运袋子(√)
- 判断1, 1, 3 能否构成幸运袋子(√)
- 从1, 3 开始
- 判断1, 3, 5 能否构成幸运袋子(x)
- 判断1, 3, 7 判断1, 1, 3 能否构成幸运袋子(x)
- 从1, 5 开始
…
…
…
排序是为了当判断当前元素不能构成幸运袋子时, 不必再判断后面的数字
因为后面的数字 ≥ 前面的数字
//幸运的袋子
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) nums[i] = sc.nextInt();
Arrays.sort(nums);
System.out.println(count(nums, n, 0, 0, 1));
}
private static int count(int[] nums, int n, int pos, int sum, int multi) {
int cnt= 0;
for (int i = pos; i < n; i++) {
sum += nums[i];
multi *= nums[i];
if (sum > multi) {
cnt= cnt+ 1 + count(nums, n, i + 1, sum, multi);
} else if (nums[i] == 1) {
cnt= cnt+ count(nums, n, i + 1, sum, multi);
} else {
break;
}
sum = sum - nums[i];
multi = multi / nums[i];
// 拥有相同号码的球是无区别的
while (i < n - 1 && nums[i] == nums[i + 1]) {
i++;
}
}
return cnt;
}
}
📢题目链接
链接:link
🔎结尾
创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油