每日一题day13 参数解析,跳石板

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

俩到经典题目


一、参数解析

题目描述

在这里插入图片描述在这里插入图片描述

解题分析

在这里插入图片描述
分析用例,要先得知参数的个数count,实际上是有效空格的个数+1
1.判断有效空格
遍历字符串
首先要判断是不是引号中的内容,如果是不管读取到的内容是啥直接i++直到匹配到下一个引号结束
如果不是引号中的内容判断字符是不是空格,如果是count+1

2.判断分解后的参数
遍历字符串
麻烦的点是如何区分双引号中的空格和实际的空格呢
首先要设置一个flag记录初值为1,然后当遇到一个引号异或一个1,然后第一次遇到引号flag变为0,当flag为0表示正在读取引号中的内容,空格为无效空格,不输出。第二次遇到引号flag还是1,表示引号内容读取完,遇到空格是真空格表示分段换行

做好上一步,就很容易分解出字符串,遍历的字符无非四种情况,引号空格(flag0)直接输出“ ”,非引号空格flag1,换行,除了引号其他数据,直接输出。引号设置标志位,不输出

代码演示

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
      public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        int count = 0;
        //先统计按规则划分后空格字符的个数
        for (int i = 0; i < str.length(); i++) {
            //如果遇到双引号,匹配到另一个双引号之前无效空格(一整串字符)
            if (str.charAt(i) == '"') {
                do {
                    i++;
                } while (str.charAt(i) != '"');
            }
            if (str.charAt(i) == ' ') {
                count++;
            }
        }
        //有效字符数为空格数+1
        System.out.println(count + 1);
        //划分字符穿
        int flag = 1;
        for (int i = 0; i < str.length(); i++) {
            //遇到一个双引号之前,要找到另一个双引号表示一整串数据
            //flag=0表示正在读取双引号内容
            //flag=1表示读取内容没有被双引号覆盖
            if (str.charAt(i) == '"') {
                flag ^= 1;//第一次匹配双引号flag置为0
            }
            //输出除双引号和其他空格数据
            if (str.charAt(i) != ' ' && str.charAt(i) != '"') {
                System.out.print(str.charAt(i));
            }
            //输出除双引号里的空格其余空格
            if (str.charAt(i) == ' ' && flag == 1) {
                System.out.println(str.charAt(i));
            }
            //输出双引号里的空格
            if (str.charAt(i) == ' ' && flag == 0) {
                System.out.print(str.charAt(i));
            }
        }
    }
}

二.跳石板

题目描述

在这里插入图片描述

解题分析

在这里插入图片描述本题做法动态规划

在这里插入图片描述
实际上我们可以设置一个数组step,注意为了下标和当前数对应上设置数组大小m+1,(0)是多余的
然后设置初始值为inter.maxvalue表示该数字没有被访问过
因为是从n开始跳到m,首先要遍历一遍,当step[i]为初始值表示该数字被跳过(没有访问到)
step[0]初值为0,表示该数第0步跳过(起点)
其余情况就需要求余,用集合存储,遍历余数j,判断跳到的台阶step[i+j]合法性,如果是第一次跳到这个台阶
直接在上一步的数量上+1,否则需要判断这次跳的台阶走法和上一次的最小值

代码演示

import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[] step = new int[m + 1];//实际上有m个数,第0个数舍去
        //初始化为
        for (int i = 0; i <= m; i++) {
            step[i] = Integer.MAX_VALUE;
        }
        step[n] = 0;
        for (int i = n; i < m; i++) {
            if (step[i] == Integer.MAX_VALUE) {
                continue;
            }
            //j表示一次跳几个台阶(约数)
            List<Integer> list = div(i);
            for (int j : list) {
                if (i + j <= m && step[i + j] == Integer.MAX_VALUE) {
                    step[i + j] = step[i] + 1;

                } else if (i + j <= m) {
                    step[i + j] = Math.min(step[i] + 1, step[i + j]);
                }
            }
        }
        if (step[m] == Integer.MAX_VALUE) {
            System.out.println(-1);;
        } else {
            System.out.println(step[m]);
        }
    }

    //求num的约数,并将他放到List集合里面
    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;
    }
}

总结

动态规划问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值