【强训】Day13

努力经营当下,直至未来明朗!


普通小孩也要热爱生活!

一、选择

  1. 一个关系数据库文件中的各条记录 ()

A 前后顺序不能任意颠倒,一定要按照输入的顺序排列
B 前后顺序可以任意颠倒,不影响库中的数据关系
C 前后顺序可以任意颠倒,但排列顺序不同,统计处理的结果就可能不同
D 前后顺序不能任意颠倒,一定要按照关键字字段值的顺序排列

  1. 下列关于视图的说法错误的是

A 视图是从一个或多个基本表导出的表,它是虚表
B 视图一经定义就可以和基本表一样被查询、删除和更新
C 某一用户可以定义若干个视图
D 视图可以用来定义新的视图

  1. 在Mysql中,订单表 ( 订单号,雇员代号,地区代号,订购日期 ) 中订单号为主键,要删除订单中前三年以前的信息, SQL 为:

A delete from 订单表 where 订购日期<getdate()+3
B delete from 订单表 where 订购日期<DATEADD(yy,3,getdate())
C delete from 订单表 where 订购日期<getdate()-3
D delete from 订单表 where 订购日期<DATEADD(yy,-3,getdate())

  1. 负责数据库中查询操作的数据库语言是( )。

A 数据定义语言
B 数据管理语言
C 数据操纵语言
D 数据控制语言

  1. SQL 语句中修改表结构的命令是()

A MODIFY TABLE
B MODIFY STRUCTURE
C ALTER TABLE
D ALTER STRUCTURE

  1. SQL 查询语句中 WHERE 、 GROUP BY 、 HAVING 这些关键字区别和用法总结错误的是()

A HAVING在查询语句中必须依赖于GROUP BY
B WHERE子句用来限制SELECT语句从表中指定选取的行
C GROUP BY子句用来分组WHERE子句的输出结果集
D HAVING子句用来从分组的结果中筛选列


二、编程

1. 参数解析

参数解析

请编写一个参数解析程序,实现将命令行各个参数解析出来。

解析规则:

1.参数分隔符为空格
2.对于用""包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s “C:\program files” "d:“时,参数仍然是4个,第3个参数应该是字符串C:\program files,而不是C:\program,注意输出参数时,需要将”"去掉,引号不存在嵌套情况。
3.参数不定长
4.输入由用例保证,不会出现不符合要求的输入
① 数据范围:字符串长度:1≤s≤1000
② 进阶:时间复杂度:O(n) ,空间复杂度:O(n)


2. ★跳石板

跳石板

小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3…
这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达

例如:
N = 4,M = 24:
4->6->8->12->18->24
于是小易最少需要跳跃5次,就可以从4号石板跳到24号石板


答案

1. 选择

  1. 关系数据库逻辑性强而物理性弱,也就是物理上的顺序并没有很大的影响。所以:关系数据库中的各条记录前后顺序可以任意颠倒,不影响库中数据的关系

故:选B

  1. ① 视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表
    ② 数据库中只存放视图的定义,不存放视图对应的数据,这些数据仍存在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之变化。
    ③ 视图就是一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。(数据只在基本表中存在)
    ④ 可以在一个视图之上再定义新的视图,但对视图的更新(增,删,改)操作则有一定的限制。

故:选B

  1. ① GETDATE() 函数从 SQL Server 返回当前的时间和日期
    ② DATEADD() 函数在日期中添加或减去指定的时间间隔
    DATEADD(datepart,number,date)
    date 参数是合法的日期表达式。
    number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数
    ④ datepart 参数可以是下列的值:
    0
    ⑤ 具体相关可以参考:SQL相关

故:选D
(前三年是过去时间,所以是负数;年是yy)

  1. SQL语言分类:(不一定)

数据定义语言 (Data Definition Language, DDL) :是SQL语言集中负责数据结构定义与数据库对象定义的语言,由CREATE、ALTER与DROP三个语法所组成。

数据操纵语言(Data Manipulation Language,DML):用户通过它可以实现对数据库的基本操作。如:insert、update、delete、select
数据控制语言(Data Control Language,DCL) :是用来设置或者更改数据库用户或角色 权限 的语句,这些语句包括GRANT、DENY、REVOKE等语句,在默认状态下,只有sysadmin、dbcreator、db_owner或db_securityadmin等角色的成员才有权利执行数据控制语言。
事务控制语言(Transaction Control Language,TCL):用于管理数据库中的事务。这些用于管理由 DML 语句所做的更改。它还允许将语句分组为逻辑事务。
TCL经常被用于快速原型开发、脚本编程、GUI和测试等方面。
TCL的核心指令为commit、rollback

故:选C

  1. ALTER TABLE 语句用于在已有的表中添加、删除或修改列。所以修改表结构使用的是alter table

故:选C

  1. 注意SQL语句的执行顺序!
    having只能用在group by之后,对分组后的结果进行筛选,筛选行(即使用having的前提条件是分组)。
    where肯定在group by 之前
    having在后,where在前!
    ④ where后的条件表达式里不允许使用聚合函数,而having可以。
    ⑤ 执行顺序:select--from--where--group by--having--order by
    ⑥ HAVING 子句用来从分组的结果中筛选,不是列,列是在select中选择输出的。

故:选D


2. 编程

  1. 参数解析

1)思路:

① 主要是考察String以及其间隔
② 是以空格以及双引号为间隔的,对于双引号中的空格要特殊处理
③ 对于双引号做标记flag,最后进行打印的时候就按照标记判断是否打印。
④ 注意统计参数个数的方式:引号外的空格数+1
⑤ 标记flag需要在0/1之间互变,使用按位异或1

2)代码:

// 参数解析
// 以空格作为分隔,引号中的空格要特别注意!
// 统计参数个数:除引号外的空格数+1

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        // 统计个数:空格+1,但是注意引号中的空格不算数
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            // 先判断引号
            if(str.charAt(i) == '"') {
                // 注意这里使用的是do...while循环
                do {
                    i++;
                } while (str.charAt(i) != '"');  // 停止++直到遇到下一个引号
            }

            // 然后判断空格(顺序不可以颠倒)
            if(str.charAt(i) == ' ') {
                count++;
            }
        }
        // 输出统计个数
        System.out.println(count+1);

        // 输出每一个参数:使用flag标记引号
        int flag = 1; // 首次遇到引号就变0,再遇到就变1
        for (int i = 0; i < str.length(); i++) {
            // 先判断是否遇到引号
            if(str.charAt(i) == '"') {
                // 使用按位异或
                flag ^= 1;
            }

            if (str.charAt(i)!=' ' && str.charAt(i)!='"') {
                // 直接进行输出
                System.out.print(str.charAt(i));
            } else if(str.charAt(i)==' ' && flag==1) {
                // 此时说明是真的空格,需要进行换行
                System.out.println();
            } else if (str.charAt(i)==' ' && flag==0) {
                // 引号中的空格,直接继续输出
                System.out.print(str.charAt(i));
            }
        }
    }
}

  1. 跳石板

1)思路:

① 使用“动归”进行解决!
steps[i]表示到达i号石板所需的最小步数初始化为steps容器为INT_MAX。
③ 从序号N的石板开始逐个遍历,若steps[i]为INT_MAX,表示该点不可到达,直接开始下次循环。若steps[i]不为INT_MAX,表示该点可以到达,下面求解编号i的约数,进行动态规划。
③ 动态规划的转移方程为:

  • steps[i+j] = min(steps[i]+1,steps[i+j]) //i为石板编号,j为i的约束
  • steps[N] = 0

④ 注意:对每一个台阶都要计算其约数进行存储,然后遍历该台阶上的约数进行判断比较。

2)代码:

// 跳石板
// 使用动归解决,还需要对每一级台阶进行约束存储
// 从n跳到m的最小次数

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    // 求约数:不含1和本身K
    private static List<Integer> div(int k) {
        List<Integer> number = new ArrayList<>();
        for (int i = 2; i <= (int) Math.sqrt(k); i++) {
            if (k % i == 0) {
                // 两个约数都需要!
                number.add(i);
                if (i != k/i) {
                    number.add(k/i);
                }
            }
        }
        return number;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();

        // steps[i]表示到到达第i级需要跳的次数!!!
        // 首先全部赋值为最大值,表示不可达
        int[] steps = new int[m+1];
        for (int i = 0; i < m+1; i++) {
            steps[i] = Integer.MAX_VALUE;
        }

        // 然后先将所在的台阶可以跳的次数/约束置0,也就是直接到达
        steps[n] = 0;
        // 开始从第n个台阶遍历,并计算每个台阶的约数
        for (int i = n; i < m; i++) { // 目标台阶不用进行步数统计,因为用不到
            if(steps[i] == Integer.MAX_VALUE) { // 表示该级台阶不可达
                continue;
            }
            // 求i的约数:使用链表进行存储,也就是在该级台阶上可以跳的台阶数
            List<Integer> number = div(i);
            // 遍历该约数链表,进行下一步走位的判断
            for (int j : number) {
                // j表示在该台阶上可以继续走多少个台阶
                // 这里的判断以及条件改变很重要!
                // 到新的台阶上的值要进行更新!
                if(i+j<=m  && steps[i+j]!=Integer.MAX_VALUE) { // 可以直达
                    steps[i+j] = Math.min(steps[i+j],steps[i]+1);
                } else if(i+j<=m) { // 不可以直达,要目前台阶开始跳
                    steps[i+j] = steps[i]+1;
                }
            }
        }
        if (steps[m] == Integer.MAX_VALUE) {
            System.out.println(-1);
        } else {
            System.out.println(steps[m]);
        }
    }
}

111

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'Dream是普通小孩耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值