每日一练——Day 13

前言:

小亭子正在努力的学习编程,接下来将开启编程题的练习~~

分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~

同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~

第一题

题目描述:

刷题点这里

描述

在命令行输入如下命令:

xcopy /s c:\\ d:\\e,

各个参数如下:

参数1:命令字xcopy

参数2:字符串/s

参数3:字符串c:\\

参数4: 字符串d:\\e

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

解析规则:

1.参数分隔符为空格
2.对于用""包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s "C:\\program files" "d:\"时,参数仍然是4个,第3个参数应该是字符串C:\\program files,而不是C:\\program,注意输出参数时,需要将""去掉,引号不存在嵌套情况。
3.参数不定长

4.输入由用例保证,不会出现不符合要求的输入

数据范围:字符串长度:1\le s\le 1000\1≤s≤1000 

进阶:时间复杂度:O(n)\O(n) ,空间复杂度:O(n)\O(n) 

输入描述:

输入一行字符串,可以有空格

输出描述:

输出参数个数,分解后的参数,每个参数都独占一行

示例1

输入:

xcopy /s c:\\ d:\\e

输出:

4
xcopy
/s
c:\\
d:\\e

解题分析:

整体思路:

本题通过以空格和双引号为间隔,统计参数个数。对于双引号,通过添加flag,保证双引号中的空格被输出

注意:

1、先输出的是个数

2、遇到""空格原样输出

3、没有""遇到空格就换行
4、遇到 "(前括号) 后,先往后移动一位,再判断下一位字符是该输出,还是遇到了 " (后括号) 

5、预设一个标记flag= 1 ,遇到双引号的前一半,flag = 0,在遇到后一半,异或运算后 flag= 1,此时双引号结束

代码实现:

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str  = in.nextLine();
        int count = 0;
        //统计个数
        for (int i = 0 ; i < str.length(); i++ ) {
            //
            if (str.charAt(i) == '"') {
                do {
                    i++;            //注意:此处i需要先往后移动一位
                } while (str.charAt(i) != '"');

            }
            if (str.charAt(i) == ' ') {
                count ++;
            }

        }
        System.out.println(count + 1);  //因为count统计的是空格数,参数个数等于空格数+1
        /*
        遇到双引号的前一半,flag = 0,在遇到后一半,异或运算后 flag= 1,此时双引号结束
        */
        int flag = 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));
            }
            //双引号中的空格需要打印
            if (str.charAt(i) == ' ' && flag == 0) {
                System.out.print(str.charAt(i));
            }
            双引号外碰到空格,需要换行
            if (str.charAt(i) == ' ' && flag == 1) {
                System.out.println();
            }
        }

    }
}

第二题

题目描述:

刷题点这里

描述

小易来到了一条石板路前,每块石板上从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号石板

输入描述:

输入为一行,有两个整数N,M,以空格隔开。 (4 ≤ N ≤ 100000) (N ≤ M ≤ 100000)

输出描述:

输出小易最少需要跳跃的步数,如果不能到达输出-1

示例1

输入:

4 24

输出:

5

解题分析:

【此题用到了动态规划,我会准备专门的文章去讲解这类题的解法,关注我一起手撕动态规划~~关注我】

题目的意思是从N开始,最少需要累加几步可以变成指定的数字M,每次累加的值为当前值的一个约数

 【解题思路】:
将1 - M个石板看做一个结果数组step,每个step[i]储存着从起点到这一步最小的步数,其中0为不能到达。 从起点开始对step进行遍历,先求i的所有约数(即从step[i]能走的步数),然后更新那几个能到达的位置的最小步数。如果不能到达则更新为此时位置的最小步数 + 1,如果是能到达的就更新为min(已记录的最小步数,此处的最小步数 + 1)),遍历一遍后得到结果。

一:动归五部曲分析题目:

1、step数组的含义:

step[i]储存着从起点到这一步最小的步数

2、确定递推公式
                    step[i+j]=Math.min(step[i+j],step[i]+1)
               或     step[i+j]=step[i]+1;
               

3、dp数组如何初始化

step[i]=Integer.MAX_VALUE;  初始化为最大值,方便后续更新

4、确定遍历顺序

从前往后顺序遍历,        for(int i=n;i<m;i++)

5、举例推导dp数组

如图上图所示的蓝色框里的n,(这里我就不单独写出来了)

二、注意:

1.约数的求解方法:

eg:12的约数

12 % i = 0 ,i 就是12的一个约数

for(int i=2;i*i<=num;i++){
    if(num%i==0){
            list.add(i);
        if(num/i!=i){
            list.add(num/i);
                }
        }
}

i  从 2 开始,是因为题目要求除了1和本身的约数

i *i <= num,是因为大于 根号下 num的数 ,都不可能被num整除

2.数组step存的是i位置最少需要跳跃的步数,

有两种情况:

当step[i+j]!=Integer.MAX_VALUE时,有不同的走法,取最小值更新step

达到step[i+j]==Integer.MAX_VALUE)时,再原来的最小步数上再走一步

 if(i+j<=m && step[i+j]!=Integer.MAX_VALUE){
                    step[i+j]=Math.min(step[i+j],step[i]+1);
                }else if(i+j<=m){
                    step[i+j]=step[i]+1;
                }

代码实现:

import java.util.Scanner;
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[] step = new int[m + 1];   //记录最小步数
        for (int i = 0; i < m + 1; i++) {
            step[i] = Integer.MAX_VALUE;  // 把每一步先置为最大值,方便后面替换
        }
        step[n] = 0;
        for (int i = n; i < m; i++) {
            //当步数等于最大值的时候说明没有走这一步,直接跳过
            if (step[i] == Integer.MAX_VALUE) {
                continue;
            }
            
 // 求i的约数
            List<Integer> list = div(i);
            //遍历每个踩到的点的约数
            for (int j : list) {
//j代表此时我们一步可以条几个台阶

                if (i + j <= m && step[i + j] != Integer.MAX_VALUE) {
     //在跳到i+j位置的步数和跳到i的步数加1,之间取最小值,存到step数组中
                    step[i + j] = Math.min(step[i + j], step[i] + 1);
                } else if (i + j <= m) {
                    
                    step[i + j] = step[i] + 1;
                }
            }
        }


        if (step[m] == Integer.MAX_VALUE) {
            System.out.println(-1);
        } else {
            System.out.println(step[m]);
        }
    } 

    //求约数的方法
    public static List <Integer> div(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);
                }
            }
        } 
        return list;

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/9640.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot基础学习之(十二):通过spring boot框架连接MySql数据库(通过idea中的工具Database连接Mysql数据库)

Springboot这个系列实现的案例&#xff1a;员工后台管理系统 之前讲解的内容是前后端的交互&#xff0c;并没有涉及到数据库。把员工信息放置在一个数组中&#xff0c;实现的方法则是对数组的增删改查操作&#xff0c;但是从今天开始&#xff0c;实现的功能则是在数据库的基础上…

Qt Quick - ToolTip

Qt Quick - ToolTip使用总结一、概述二、附带的ToolTip三、延迟和超时四、自定义ToolTip五、定制化一、概述 ToolTip 其实就是ToolTip&#xff0c;所谓ToolTip其实就是一段简短的文本&#xff0c;告知用户控件的功能。它通常置于父控件之上或之下。提示文本可以是任何富文本格…

为什么程序员都喜欢开源的软件?

先来感受一下开源与闭源&#xff1a; 当你觉得这个软件有一个缺点影响使用的时候 如果是闭源软件&#xff0c;你如果不想自己模仿着写一个&#xff0c;就只能考虑顺着网线到开发者脖子上逼着他加 但开源软件你可以自己在他的基础上改一改&#xff0c;你改好了还拿回馈回去让…

动力节点王鹤SpringBoot3笔记——第七章 视图技术Thymeleaf

目录 第七章 视图技术Thymeleaf 前言 7.1 表达式 7.2 if-for 第七章 视图技术Thymeleaf 前言 Thymeleaf 是一个表现层的模板引擎&#xff0c; 一般被使用在 Web 环境中&#xff0c;它可以处理 HTML, XML、 JS 等文档&#xff0c;简单来说&#xff0c;它可以将 JSP 作…

将Mircrosoft Store下载的Ubuntu安装到指定位置方法,同时解决“你需要来自System的权限才能对此文件进行更改”问题

一、概述 最近使用到WIndows的WSL功能&#xff0c;需要安装ubuntu这个子系统进行仿真环境搭建&#xff0c;但是又不愿意使用虚拟机&#xff0c;不太方便。在安装过程中发现本身就岌岌可危的C盘经常突然爆满&#xff0c;经过检查发现是安装ubuntu位置的问题。但是在系统更改存储…

网络安全从业人员应该如何提升自身的web渗透能力?

前言 web 渗透这个东西学起来如果没有头绪和路线的话&#xff0c;是非常烧脑的。 理清 web 渗透学习思路&#xff0c;把自己的学习方案和需要学习的点全部整理&#xff0c;你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词&#xff0c;叫 35 岁危机&#xff0c;&am…

利用多专家模型解决长尾识别任务

来源&#xff1a;投稿 作者&#xff1a;TransforMe 编辑&#xff1a;学姐 贡献 提出了RoutIng Diverse Experts&#xff08;RIDE&#xff09;&#xff0c;不仅可以减少所有类别的variance&#xff0c;并且还可以减少尾部类的bias。同时提升了头部和尾部的性能。 思路 目前存…

nuxt.js 在IE浏览器||其他浏览不识别document/window 情况处理

1 第一步注册到nuxt.config.js文件 2 第二步建立js 文件 import Vue from vue (function(){ if(process.client){ console.log(process.client) }else{ console.log(process.client) } if (!!window.ActiveXObject || "ActiveXObject" i…

Stable Diffusion:一种新型的深度学习AIGC模型

潜在扩散模型 | AIGC| Diffusion Model 图片感知压缩 | GAN | Stable Diffusion 随着生成型AI技术的能力提升&#xff0c;越来越多的注意力放在了通过AI模型提升研发效率上。业内比较火的AI模型有很多&#xff0c;比如画图神器Midjourney、用途多样的Stable Diffusion&#…

国货之光!打工人必装的8个软件,你都用过没?|办公|效率|创作

给大家分享8款非常强大&#xff0c;但知名度不高的国产软件&#xff0c;每一个都堪称精品&#xff0c;喜欢的话记得点赞和关注哦~ 第一款是 火绒安全软件 火绒安全软件没有任何&#xff0c;具有推广性质的弹窗、没有捆绑打扰用户的行为&#xff1b;占用资源极少&#xff0c;&a…

腾讯空降测试工程师,绩效次次拿S,真是砂纸擦屁股,给我露了一手啊

​上周我们公司的绩效面谈全部结束了&#xff0c;每年到这个时间点就是打绩效的时候了&#xff0c;对于职场打工人来说绩效绝对是最重要的事情之一&#xff0c;原因也很简单&#xff1a;奖金、晋升、涨薪都和它有关系。 比如下面这个美团员工在脉脉上的自曝就很凄凉&#xff1…

Python 操作 MongoDB 详解

嗨害大家好鸭&#xff01;我是芝士❤ 一、前言 MongoDB属于 NoSQL&#xff08;非关系型数据库&#xff09;&#xff0c; 是一个基于分布式文件存储的开源数据库系统。 二、操作 MongoDB 1. 安装 pymongo python 使用第三方库来连接操作 MongoDB&#xff0c; 所以我们首先安…

Redis的SDS、intSet、Dict、ZipList、QuickList、RedisObject及五种数据结构详解

动态字符串 我们都知道Redis中保存的key是字符串&#xff0c;value 往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构 不过Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff1a; 1.获取字符串长度需要进行计算 2.…

网络安全之入侵检测

目录 网络安全之入侵检测 入侵检测经典理论 经典检测模型 入侵检测作用与原理 意义 异常检测模型&#xff08;Anomaly Detection&#xff09; 误用检测模型&#xff08;Misuse Detection&#xff09; 经典特征案例 ​编辑自定义签名 ​编辑 签名检查过程 检测生命周期…

http请求类RestTemplate

RestTemplate类1.1 初识RestTemplate1.2 注入方式1.3 常用方法1.1 初识RestTemplate RestTemplate类是一个用于发送HTTP请求并获取HTTP响应的模板类。它可以被用于执行GET&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE等各种HTTP方法&#xff0c;同时还支持处理请求参数…

微信小程序python+vue今日菜谱美食点赞收藏评价系统

谈到外出就餐&#xff0c;我们除了怕排队&#xff0c;也怕这家餐厅的服务员不够用&#xff0c;没人为我们点餐&#xff0c;那么一餐饭排队一小时&#xff0c;点餐恐怕也要花个半小时&#xff0c;这样不仅给消费者的用餐体验大打折扣同时也给商家的口碑造成了严重负面的影响&…

KD-2125地下电缆测试仪

一、产品概述 管线探测仪是一套高性能地下金属管线探测系统&#xff0c;由信号发射机和接收机组成&#xff0c;可用于金属管线、地下电缆的路径探测、管线普查和深度测量&#xff0c;配合多种选配附件&#xff0c;可以进行唯一性鉴别&#xff0c;以及管道绝缘破损和部分类型电缆…

在Win10安装pytorch3d

Pytorch3d 这是一个为使用Pytorch的3D计算机视觉研究提供的高效可重用的组件 主要特点包括&#xff1a; 用于储存和操作三角形网格的数据结构三角形网格的高效操作&#xff08;投影变换、图形卷积、采样、损失函数&#xff09;可区分的网格渲染器可以通过隐式函数进行新试图…

Object.defineProperty()和 Proxy的区别

众所周知&#xff0c;Object.defineProperty()和 Proxy的区别也是Vue2和Vue3响应式的区别&#xff0c;现在就聊一下为什么Proxy会替代Object.defineProperty() Object.defineProperty()&#xff1a; Object.defineProperty() 方法会直接在一个对象上定义一个新属性&#xff0…

字节8年测试经验,送给想要学习自动化测试的同学6条建议

我的职业生涯开始和大多数测试人一样&#xff0c;开始接触都是纯功能界面测试。那时候在一家电商公司做测试&#xff0c;做了有一段时间&#xff0c;熟悉产品的业务流程以及熟练测试工作流程规范之后&#xff0c;效率提高了&#xff0c;工作比较轻松&#xff0c;也得到了更好的…
最新文章