【Java版oj】day13参数解析、跳石板
创始人
2025-05-31 08:49:10
0

目录

 一、参数解析

(1)原题再现

(2)问题分析

(3)完整代码

 二、跳石板

(1)原题再现

(2)问题分析

(3)完整代码


 一、参数解析

(1)原题再现

参数解析_牛客题霸_牛客网

描述

在命令行输入如下命令:

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

(2)问题分析

       本题我们可以使用一个快慢指针法。对指针等于空格和引号分别作出判断。

       首先考虑没有引号的情况:快指针先在前走,慢指针在原地,当快指针遇到空格时,划分一个字符串。然后改变快慢指针的指向,注意不要把快慢指针指向同一个字符,不方便对有引号的情况进行分割,要一前一后,初始值无所谓。开始下一个字符串的划分。

       其次考虑给定字符串有引号的情况:同样运用快慢指针,在后的慢指针遇到第一个引号,只有当在前的快指针遇到第二个引号时,才进行分割。注意的是,因为快慢指针一前一后,所以快指针不会遇到第一个引号的。

       分情况讨论:当慢指针没有遇到引号时,快指针跟空格进行判断;当慢指针遇到引号时,快指针跟引号进行判断。

       在运行时,我还遇到了一个奇怪的问题,就是字符串的输出格式与题目要求不同,按照上诉思想进行分割时,有些情况分割的字符串两端会出现空格,我们可以使用trim()方法除去两端空格

(3)完整代码

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();String ans;int slow = 0;int fast = 0;int count = 0;Listres = new LinkedList<>();while (fast < str.length()) {if (str.charAt(slow) != '"') {while (fast < str.length() && str.charAt(fast) != ' ') {fast++;}ans = str.substring(slow, fast).trim();res.add(ans);count++;slow = fast + 1;fast = slow + 1;} else {while (fast < str.length() && str.charAt(fast) != '"') {fast++;}ans = str.substring(slow + 1, fast ).trim();res.add(ans);count++;slow = fast + 1;fast = slow + 1;}}System.out.println(count);for (int i = 0; i < res.size(); i++) {System.out.println(res.get(i));}}
}

 二、跳石板

(1)原题再现

跳石板_牛客题霸_牛客网

描述

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

2

(2)问题分析

        本题本质上是一道动态规划。首先我们定义一个状态数组minSteps[],里面用来保存到达i所用的最小步数。所有数组值初始化默认为Integer.MAX_VALUE,如果到最后遍历完还是Integer.MAX_VALUE,就表示到不了这个点。

        初始状态时i=n时,就是小易当前所在的石板编号,定义他的初始状态就是0,不需要跳步,本身就在这个位置。状态方程:

minSteps[i + list.get(j)] = Math.min(minSteps[i + list.get(j)], minSteps[i] + 1);

        表示的是到编号i+i编号的因子list.get(j)的这块石板的步数,由两种情况,一种是这个位置上次所记录的最小步数;另一种是这次从石板跳一步步长为list.get(i)的步数(i位置所记录的最小步数+1)。这两者之间取最小值,记录下来。

        具体的每一步可以看代码,我写了详细的解析。

        本题还有一个注意点:就是运行超时的问题。所以我们在求一个数的因子时,不要使用n,而是Math.sqrt(n) n的平方根。一个数都是由他的较大的因数和较小的因数的乘积组成。所以我们只需遍历一半就可以了。

        需要格外小心的是,可能这两个因数一样大,就像7*7=49,我们只需要加入链表一次就可以了。

(3)完整代码

import java.util.*;//注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();System.out.println(leastStep(n, m));}
//动态规划求最小步数public static int leastStep(int n, int m) {if (m == n) {return 0;} else {//minSteps[i]表示到达i所用的最小步数,所有数组值初始化默认为Integer.MAX_VALUE,如果到最后遍历完还是Integer.MAX_VALUE,就表示到不了这个点。int []minSteps = new int[m + 1];for (int i = 0; i < minSteps.length; i++) {minSteps[i] = Integer.MAX_VALUE;}// Arrays.fill(minSteps,Integer.MAX_VALUE);minSteps[n] = 0; //初始状态,从n到达石板n的最小步数为0for (int i = n; i < m+1  ; i++) {if (minSteps[i] == Integer.MAX_VALUE) { //一次都没有到达过就跳过这次循环continue;}List  list = new ArrayList<>();approximate(list, i);//求当前编号为i石板的因子for (int j = 0; j < list.size(); j++) {if (i + list.get(j) <= m) { //从编号i的石板往后跳list.get(j)步,判断是否越界minSteps[i + list.get(j)] = Math.min(minSteps[i + list.get(j)], minSteps[i] + 1);}}}if (minSteps[m] == Integer.MAX_VALUE) {return -1;} else {return minSteps[m];}}}public static Listapproximate(List list, int n) {for (int i = 2; i <= Math.sqrt(n); i++) {if (n % i == 0) {//较小的因子list.add(i);}//判断较大的因子是不是和较小的因子一样大,如果是就不要加进链表if (n % (n/i) ==0 && n / i != i) {list.add(n / i);}}return list;}
}

 


 

相关内容

热门资讯

新基建风向标:关于ChatGP...  进入2023年以来,ChatGPT大火。朋友圈里充斥着关于ChatGPT的各种消息&...
【并发】详解redis的inc... 一、前言 redis是一个单线程的服务,那么所有的命令肯定会排队被redis执行&#x...
“来来去去”的意思 “来来去去”的意思 成语拼音: [lái lái qù qù] ...
燮理阴阳的成语接龙 燮理阴阳的成语接龙  顺接:燮理阴阳 → 阳台云雨 → 雨意云情 → 情趣相得 → 得人死力 → 力...
形容老人的成语   白首之心 白发苍颜 七老八十 满面春风 雪鬓霜鬟  皓首苍颜 宝刀不老 养儿防老 矜贫恤独 庞眉...
“三十六策,走是上计”的意思 “三十六策,走是上计”的意思 成语拼音: [sān shí liù cè,zǒu shì...
深度学习目标检测项目实战(三)... 深度学习目标检测项目实战(三)—基于Yolov5的遥感图像目标检测 这里使用官方的yolov5.60...
react基础知识创建hell 下载babel----https://www.babeljs.cn/setup#installati...
unity的C#学习——访问修... 访问修饰符——变量、方法的私有化与公有化 在C#中,可以使用访问修饰符来指定变量和方法...
勠力同心词语解析 勠力同心词语解析  中国历史悠久,中华文化源远流长、博大精深,汉语成为世界上最有魅力的语言文化之一,...
“毫发丝粟”的意思 “毫发丝粟”的意思 成语拼音: [háo fā sī sù] ...
“怀道迷邦”的意思 “怀道迷邦”的意思 成语拼音: [huái dào mí bāng] ...
“传风扇火”的意思 “传风扇火”的意思 成语拼音: [chuán fēng shān huǒ] ...
支付宝手机网站支付,app支付... 一.支付宝支付相关文档地址:支付宝支付相关的文档地址:https://o...
“舍生存义”的意思 “舍生存义”的意思 成语拼音: [shě shēng cún yì] ...
“羞花闭月”的意思 “羞花闭月”的意思 成语拼音: [xiū huā bì yuè] ...
“舐皮论骨”的意思 “舐皮论骨”的意思 成语拼音: [shì pí lùn gǔ] ...
“切骨之寒”的意思 “切骨之寒”的意思 成语拼音: [qiè gǔ zhī hán] ...
LLVM PASS pwn LLVM LLVM的核心是一个库,其设计了一种通用的LLVM IR,并提供一系列接口来操作LLVM ...
聚焦采购数字化,企企通受邀出席... 当下,企业成本压力持续走高,采购业已成为企业保持可持续增长的重要一环。为...