思路:
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();
- }
- }
- }
- }
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;
- }
- }