【day13】每日一题——参数解析&跳石板

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

【day13】每日一题——参数解析&跳石板_第1张图片

思路:

1.个数 = 双引号外面的空格数量 + 1;

2.遍历字符串,一直打印 

3.遇到双引号外面的空格,换行

4.双引号里面,遇到空格也一直打印,用一个变量来控制空格是双引号里面的空格还是双引号外面的空格

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++;
                }while(str.charAt(i) != '"');//do的使用
            }
            //如果遇到双引号外的空格就计数
            if(str.charAt(i) == ' '){
                count++;
            }
        }

        //遍历结束后,count就是空格的个数
        //这时要打印参数个数
        //参数个数 = count + 1;
        System.out.println(count + 1);

        //打印完参数个数,开始打印字符串
        //定义一个flag来控制打印双引号里面的空格
        int flag = 1;
        for(int i = 0; i < str.length(); i++){
            //如果这时遇到第一个双引号,改变flag=0;
            //遇到第二个双引号的时候再改变=1
            //在flag=0期间,一直打印
            if(str.charAt(i) == '"'){
                flag ^= 1;//异或将1变成零,将0变成1
            }

            //1.如果不是空格和双引号就一直打印
            if(str.charAt(i) != ' ' && str.charAt(i) != '"'){
                System.out.print(str.charAt(i));
                //这时候不用换行,一直打印
            }

            //2.如果遇到双引号里面的空格,也一直打印
            if(str.charAt(i) == ' ' && flag == 0){
                System.out.print(str.charAt(i));
            }

            //3.遇到双引号外面的空格要换行
            if(str.charAt(i) == ' ' && flag == 1){
                System.out.println();
            }
        }
    }
}

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

【day13】每日一题——参数解析&跳石板_第2张图片

1.第一部分:step 的长度为m+1,是为了与石板号从1开始对应上,而不是从0,然后把元素全部设置为默认值,方便之后的比较

2.写一个专门求一个数的约数的方法,把一个数的约数存放在一个list里面,以便遍历list来跳石板

3.第二部分开始跳跃,把小易站的位置设置为0,代表跳跃的次数,也可以说此时还没有跳,跳的次数为0

4.开始跳跃后,是通过遍历数组里面的每一个下标来跳跃的,当到达当前下标,如果为默认值就说明前面的跳跃是直接略过了这块石板,所以继续往下一个石板遍历

5.跳的时候遍历约数list来跳,j代表一次性能跳多少块石板,i代表当前所在位置~~

6.第一个if表示,这不是第一次跳到这块石板,所以直接比较之前跳到这块石板所用的次数和现在(也就是另外一个约数)跳到这块石板所用的次数谁打谁小

7.else if表示是第一次跳到,前面的最优结果加上1就是当前石板的最优解~也就是最小次数

8.跳完所有石板后开始判断(第三部分)如果m下标还是为默认值,就说明没有跳到m石板上过

否则就直接打印出step[m],表示当前石板上的最优解

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        
//1
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[] step = new int[m+1];
        for(int i = 0; i < m+1; i++){
            step[i] = Integer.MAX_VALUE;
        }
//2
        step[n] = 0;
        for(int i = 0; i < m; i++){
            if(step[i] == Integer.MAX_VALUE){
                continue;
            }

            List list = div(i);
            for(int j : list){
                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;
                }
            }
        }
//3
        if(step[m] == Integer.MAX_VALUE){
            System.out.println(-1);
        }else{
             System.out.println(step[m]);
        }

    }

    //求约数
    public static List div(int num){
        List 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;
    }
}

你可能感兴趣的:(java,算法,c++)