思路:
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<Integer> 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<Integer> div(int num){
List<Integer> list = new ArrayList<Integer>();
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;
}
}