大家好,我是LvZi,今天带来
笔试狂刷--Day3
一.牛牛的快递
1.题目链接:牛牛的快递
2.分析:
简单的模拟
3.代码实现:
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);double a = in.nextDouble();char b = in.next().charAt(0);// next的返回值是stringint ret = 0;if(a <= 1) ret = 20;else {ret = (int)Math.ceil(a - 1) + 20;// 向上取整 ceil天花板// floor是向下取整 地板}if(b == 'y') ret += 5;System.out.println(ret);}
}
总结:
- 通过Scanner读取时,只能一次读取一个字符串,不能读取单独的字符,使用
in.next().charAt(0)
来读取字符 - 向上取整 ceil天花板; floor是向下取整 地板
二.最⼩花费爬楼梯
1.题目链接:最⼩花费爬楼梯
2.分析:
简单的线性dp
3.代码实现:
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int[] cost = new int[n + 1];for(int i = 0; i < n; i++) cost[i] = in.nextInt();int[] dp = new int[n + 1];dp[0] = cost[0]; dp[1] = cost[1];for(int i = 2; i <= n; i++) {dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];}System.out.println(dp[n]);}
}
三.数组中两个字符串的最⼩距离
1.题目链接:数组中两个字符串的最⼩距离
2.分析:
// 最容易想到的解题思路是暴力解法 固定一个位置,然后从前往后遍历第二个字符即可 时间复杂度为O(N^2)会超时
// 耗费时间最多的地方在于每次都要从当前字符的下一个位置遍历,实际上完成了两次对数组的遍历–想办法通过一次遍历就能得到结果
// 要完成的工作其实也很简单–遇到str1,就找左边离得最近的str2;遇到str2,就找左边离得最近的str1;
// 实际上我们只需要两个变量去标记离当前位置最近的str1和str2的下标即可
// 如何保证呢?只要是从左往右遍历就能保证存储的是最近的下标
// 这种优化方式也叫做预处理思想
代码实现:
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();String s1 = in.next(), s2 = in.next();if(s1 == null || s2 == null) System.out.print(-1);String[] s = new String[n];for(int i = 0; i < n; i++) s[i] = in.next();// 使用两个变量进行预处理int len = 0x3f3f3f3f, prev1 = -1, prev2 = -1;for(int i = 0; i < n; i++) {String tmp = s[i];if(tmp.equals(s1)) {// 等于第一个字符prev1 = i;// 更新下标if(prev2 != -1) len = Math.min(len, prev1 - prev2);// 更新结果}else if(tmp.equals(s2)) {prev2 = i;if(prev1 != -1) len = Math.min(len, prev2 - prev1);}}System.out.print(len == 0x3f3f3f3f ? -1 : len);}
}
总结:
-
prev1
:离当前位置最近的(从右往左数)str1的下标prev2
:离当前位置最近的(从右往左数)str2的下标
- prev1和prev2都初始化为-1,注意在遍历的时候如果其中一个为-1,证明在当前位置之前没有出现过str1/str2,此时就不能更新结果