目录
一、选择题
二、编程题
❎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;
}