草庐IT

【百日冲大厂】第十三篇,牛客网选择题+编程题参数解析+跳石板(动态规划)

良辰针不戳 2024-03-12 原文

前言:

  • 大家好,我是良辰丫,第十三篇,牛客网选择题+编程题参数解析+跳石板(动态规划).💞💞💞
  • 每一次努力,都是幸运的伏笔;天再高又怎样,踮起脚尖就更接近阳光。

🧑个人主页:良辰针不戳
📖所属专栏:百日冲大厂
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。

目录

1. 选择题

关系数据库逻辑性强物理性弱,因此关系数据库中的各条记录前后顺序可以任意颠倒,不影响库中的收据关系.

  • 物理性弱就是插入顺序可以任意颠倒.
  • 我们进行增删查改操作依赖于我们的条件如何写.

根据题意我们可以得出员工到计算机是1对多;计算机到员工是1对1.

视图只是定义出来的虚表,只是为了方便查找,不能进行增删改的操作,但是可以删除自己本身(也就是删除该视图),也可以进行查找操作.

  • create view 视图名字 as select…
  • 上面就是创建视图的方式,其实他只是简化了我们的输入的查询语句,它的查询操作和select基本一样.
    select * from 视图名字.

上述基本考察的是mysql与sql server语言的数据库.

  • DATEADD(datepart,number,date)
    datapart参数可以为yy/yyyy/qq/q等表示日期时间
    number是你希望添加时间的间隔数.
    date是日期表达式.
  • GETDATE()函数是sql server中的.
    mysql获取当前时间与日期是now(),mysql中没有GETDATE()函数
    mysql中也有dateadd()函数,语法为DATE_ADD(date,INTERVAL expr type)
    date参数是合法的日期表达式,expr参数是添加的时间间隔.
  • A与C中不能对时间直接进行加减.
  • 删除前三年的,因此在时间间隔参数为-3.

  • 数据定义语言(DDL),用来创建数据库的各种对象(表,视图,索引等)
    create table/view/index…
  • 数据库操作语言(DML),主要负责数据的基本操作,包括增删查改等操作.
  • 数据控制语言(DCL),用来授权或回收访问数据库的特权,并且控制数据库操作事务发生的时间及其效果,对数据库实行监视等.
    grant:授权
    rollback [work] to [savepoint] : 回退到某一点
    rollback:回滚
    回滚命令使数据库状态回到上次最后提交的状态,格式为:sql>rollback
    commit [work] : 提交

数据库管理系统主要是数据库服务端,具有保存数据以及控制客户端进行访问的一类软件.

修改字段与修改表结构都与alter有关.

  • between…end…左闭右闭
  • interval可以作为函数,也可以作为关键字
  • interval作为函数的时候,它被当做一个被比较数,例如interval(4,0,1,2,3,4,5,6),4为被比较数,后面的数为比较数,返回小于等于4的个数,返回5.
  • interval作为关键字的时候,表示时间间隔,常用在date_add(),date_sub()函数中,常用于时间的加减法,在查询当前时间之前的日期:select now()-interval 2 hours

  • where是分组前的过滤
  • having是分组后的过滤
  • D选项中说的是从结果后筛选,不是从结果,而是分组后,通过having后面的条件进行过滤后得到的结果.

2. 编程题

2.1 参数解析

做题链接:
链接: 参数解析

题目描述:


做题思路:

  • 先考虑特殊情况,有双引号的时候.
  • 我们先考虑参数个数,双引号算一一个整体,一对双引号是一个参数;其余的部分以空格间隔,遇到空格参数个数加1.
  • abc def ghi 这个字符串有三个参数,但是有两个空格,由此可见,参数计数器默认为1;但是可能会有参数为0的情况,有时候需要特殊处理,这道题没有参数为0的情况,大家需要多方面考虑.
  • 统计完参数个数,打印出来.
  • 第二次遍历,要打印各个参数.
  • 还是先处理双引号的,把双引号当做整体打印出来(注意不能打印双引号符号)
  • 其余的直接打印,遇到空格进行换行.
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int len = str.length();
        //计数器统计参数个数,这里没考虑参数为0的情况
        int count = 1;
        for(int i = 0;i<len;i++){
        //ch提取字符
            char ch = str.charAt(i);
        //遇到双引号进行处理,双引号为一个整体
            if(ch == '"'){
                do{
                    i++;
                    ch = str.charAt(i);
                }while(ch != '"');
                i++;
                //下面的i可能会越界
                if(i <len)
                ch = str.charAt(i);
            }
            if(ch ==' '){
                count++;
            }
            
        }
        //处理完毕后打印count
        System.out.println(count);
        //第二次遍历,打印参数
        for(int i = 0;i<len;i++){
            //flag用来记录是否用到了双引号
            int flag = 1;
            char ch = str.charAt(i);
            if(ch == '"'){
                flag = -1;
                i++;
                ch = str.charAt(i);
            }
            if(flag == 1 && ch !=' '){
                System.out.print(ch);
                //遇到空格打印换行
            } else if(flag == 1 && ch == ' '){
                System.out.println();
            }
            if(flag == -1 ){
                do{
                    System.out.print(ch);
                    i++;
                    ch = str.charAt(i);
                }while(ch != '"');
                flag = -flag;
                i++;
                System.out.println();
            }
            
        }
    }
}

我们常见的循环有以下几种,我们都需要思考到,有时候do…while循环更方便一些,可以有效的判断边界.

  • for循环
  • foreach循环
  • while循环
  • do…while循环

有时候一些边界我们根本看不出来,别的实例都符合,但总有一个不符合,会越界,怎么有效的防止这种情况呢?我们可以把容易越界的语句加上条件,防止它越界.

2.2 跳石板

做题链接:
链接: 跳石板

题目描述:


做题思路:
这是一道动态规划题,稍微有点难度,尤其是找不到状态转移方程的时候.那么我们该如何思考这一类问题呢?

  • 模拟过程,看是否可以有重复的过程,有重复的过程往往都需要用到动态规划,并且需要理解清楚过程.
  • 我们首先要理解动态规划的状态表示,集合表示什么.
  • 这道题我们定义了一个数组f,数组的下标表示小易跳到的位置,f[i]表示从n到达i位置的步数.
  • 我们还需要知道一个属性,也就是这道题所要求的是什么,在这里我们的属性是求到达i位置的最小步数.
  • 接下来最重要的就是状态转移方程了.
  • 那么状态转移该怎么想呢?每道动规找到了状态转移方程,问题基本就迎刃而解了.
  • 在我们这道题中允许一次跳的步数是非1与非它本身的约数,因此我们需要找到它的约数.
  • 该怎样保存它的约数呢?我们想到了集合,一个数可能有许多约数,用集合保存再好不过了.
  • 有了约数我们就可以知道在该位置可以走哪几种步数,通过foreach循环进行遍历,然后选取最小值.
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] f = new int[m+1];
        //因为我们要求最小值,所以我们要存储一下大的数字才能凸显最小值
        for(int i = 0;i<=m;i++){
            f[i] = Integer.MAX_VALUE;
        }
        //n为刚开始的位置,刚开始没走,为0
        f[n] = 0;
        for(int i = n;i<=m;i++){
        //下面这一句怎么理解呢?这表示i前面的位置没有
        //可以直接有机会跳到此位置.(无机会)
        //这种情况下既没有必要记性计算
            if(f[i] == Integer.MAX_VALUE){
                continue;
            }
            List<Integer> list = list(i);
            for(int x:list){
            //可以走的步数为x
            //下面就是状态转移方程
                if(i+x <= m&&f[i+x] != Integer.MAX_VALUE){
                    f[i+x] = Math.min(f[i]+1,f[i+x]);
                } else if(i+x<=m){
                //下面表示暂时i+x的位置没有被跳过
                    f[i+x] = f[i] + 1;
                }
            }
           
            
        } 
        if(f[m] == Integer.MAX_VALUE){
                System.out.println(-1);
            }else{
                System.out.println(f[m]);
            }

    }
    //下面是找约束放入集合的过程
    //一定注意细节,尤其是if与else的细节
    private static List<Integer> list(int num){
        List<Integer> list = new ArrayList<>();
        for(int i = 2;i*i<=num;i++){
            if(num%i==0){
                list.add(i);
                if(num/i != i){
                    list.add(num/i);
                }
            }
            //下面的注释代码就不对
            // else if(num%(num/i) == 0){
            //     if(i != num/i){
            //         list.add(num/i);
            //     }
            // }
        }
        return list;
    }
}

有关【百日冲大厂】第十三篇,牛客网选择题+编程题参数解析+跳石板(动态规划)的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  3. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  4. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  5. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

    两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

  6. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  7. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  8. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  9. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  10. ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数) - 2

    我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告

随机推荐