【每日编程】跳石板 && 参数解析

目录

一、选择题

 二、编程题

❎1、参数解析

❎2、跳石板(动态规划,难)


一、选择题


 二、编程题

❎1、参数解析

思路:

1、通过双引号和空格为间隙,统计参数个数。

2、对于双引号,通过添加flag来保证中间的空格可以进行输出。 (注意标志位的使用,自己写的时候关于双引号中间的空格一直没有输出成功。)

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) == '"') {
                do {
                    i++;
                } while (str.charAt(i) != '"');
            }
            if (str.charAt(i) == ' ') {
                count++;
            }
        }
        System.out.println(count + 1);
        int flag = 1;
        for (int i = 0; i < str.length(); i++) {
            //第一个双引号变0,遇到第二个变1
            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();
            }
        }
    }

❎2、跳石板(动态规划,难)

 

  

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();//4
        int m = sc.nextInt();//24
        //m+1是因为有m块石板,我们为了让石板下标与编号对应
        int[] step = new int[m+1];
        //初始化
        for (int i = 0; i < m+1; i++) {
            step[i] = Integer.MAX_VALUE;
        }
        step[n] = 0;
        //i表示当前石板编号
        for (int i = n; i < m; i++) {
            //无法跳跃到该位置
            if(step[i] == Integer.MAX_VALUE){
                continue;
            }
            //求一个数的约数的集合,不包括1和本身
            List<Integer> list = div(i);
            //遍历所有的约数
            for (int j : list) {
                //假设之前跳到i+j的石板路径为4,而跳到i的次数是2,那么现在i到i+j就是2+1为3次。
                //那么最新的最小次数就是step[i] +1
                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;
                }
            }
        }
        if(step[m] == Integer.MAX_VALUE){
            //调不到这个石板上
            System.out.println(-1);
        }else{
            System.out.println(step[m]);
        }
    }

    /**
     * 求约数
     * @param n
     * @return
     */
    private static List<Integer> div(int n) {
        List<Integer> list = new ArrayList<>();
        for (int i = 2; i*i <= n ; i++) {
            if(n%i==0){
                list.add(i);
                if(n/i!=i){
                    list.add(n/i);
                }
            }
        }
        return list;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值