day13—编程题

文章目录

  • 1.第一题
    • 1.1题目
    • 1.2思路
    • 1.3解题
  • 2.第二题
    • 2.1题目
    • 2.2涉及的相关知识
    • 2.3思路
    • 2.4解题

1.第一题

1.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.2思路

  1. 通过除掉双引号里面的空格的数目统计字符串的数目
  2. 遍历输入的字符串,依次打印每一个字符,定义一个变量让其可以在遇到双引号的时候发生变化,如果遇到空格并且是双引号里面的就打印,如果遇到空格并且是不是双引号里面的就换行

1.3解题

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            //碰到双引号就直接遍历,不管是不是空格
            if (str.charAt(i) == '"') {
                i++;
                //知道碰到第二个双引号才停止遍历
                while ( str.charAt(i) != '"') {
                    i++;
                }
            }
            if (str.charAt(i) == ' ') {
                count++;
            }
        }
        //字符串的总数等于空格的数(不算双引号里面的)加一
        System.out.println(count + 1);
        //定义一个变量让其可以在遇到双引号的时候发生变化
        int flg = 1;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '"') {
                //遇到第一个双引号就变成0,再次遇到双引号就变成1
                flg ^= 1;
            } else if (str.charAt(i) == ' ' && flg == 0) {
                //如果遇到空格并且是双引号里面的就打印
                System.out.print(str.charAt(i));
            } else if (str.charAt(i) == ' ' && flg == 1) {
                //如果遇到空格并且是不是双引号里面的就换行
                System.out.println();
            } else {
                System.out.print(str.charAt(i));
            }
        }
    }
}

2.第二题

2.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

2.2涉及的相关知识

动态规划是指通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题和最优子结构性质的问题

包装类:
基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647

顺序表:ArrayList
add() 将元素插入到指定位置的 arraylist 中
get() 通过索引值获取 arraylist 中的元素
size() 返回 arraylist 里元素数量

2.3思路

  1. 写一个函数求得一个数的所有约数(使用顺序表)
  2. 将1-m个石板看成数组,将数组中的所有数初始化为同一个不可能是他跳跃所需要的步数的数,从起点开始对数组进行遍历,求i的所有约数
  3. 更新能到达位置的最小步数,如果还没有到达过则更新为此时位置的最小步数 + 1,如果是到达过的就更新为 min(已记录的最小步数,此处的最小步数 + 1))
  4. 最后如果还是最开始初始化的那个数,就说明不能到达;如果不是就返回所求台阶当前数组记录的数

2.4解题

import java.util.*;
public class Main {
    //求一个数的所有约数
    public static List<Integer> div(int n) {
    	//list中存放的是整形元素
        List<Integer> list = new ArrayList<>();
        for (int i = 2; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
                //如果这个数是所求的数的约数,就把它放在顺序表中
                list.add(i);
                if (n / i != i) {
                    //如果这个数是所求的数的约数并且不是已经放过的数,也把它放在顺序表中
                    list.add(n / i);
                }
            }
        }
        return list;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] arr = new int[m + 1];
        for (int i = 0; i < arr.length; i++) {
            //将数组中的所有数初始化为同一个不可能是他跳跃所需要的步数的数
            //Integer.MAX_VALUE=2147483647
            arr[i] = Integer.MAX_VALUE;
        }
        //将起始的台阶的地方的修改为0
        arr[n] = 0;
        for (int i = n; i < m; i++) {
            if (arr[i] == Integer.MAX_VALUE) {
                continue;
            }
            //i表示当前所在的台阶数
            List<Integer> list = div(i);
            for (int j = 0; j < list.size(); j++) {
                //step表示每一步可以跳几个台阶
                int step = list.get(j);
                //i + step <= m保证数组不越界
                if (i + step <= m && arr[i + step] != Integer.MAX_VALUE) {
                    arr[i + step] = Math.min(arr[i + step], arr[i] + 1);
                } else if (i + step <= m) {
                    arr[i + step] = arr[i] + 1;
                }
            }
        }
        if (arr[m] == Integer.MAX_VALUE) {
            System.out.println(-1);
        } else {
            System.out.println(arr[m]);
        }
    }
}

你可能感兴趣的:(每日一题,java,算法,开发语言)