提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
俩到经典题目
一、参数解析
题目描述
解题分析
分析用例,要先得知参数的个数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;
}
}
总结
动态规划问题