题一、徒步行走
题目描述:
小明想从A徒步到B,总路程需要M天,路程中为了确保安全,小明每天需要消耗1份食物。在起点及路程当中,零星分布着N个补给站,可以补充食物,不同补给站的食物价格可能不同。请问小明若要安全完成徒步,最少需要花费多少钱呢?
输入描述:
第一行为两个正整数M、N,代表总路程M天,补给站个数N。
接下来N行,每行有两个非负整数A、B代表一个补给站,表示第A天经过该补给站,每份食物的价格为B元。
A是从0开始严格递增的,即起点一定有补给站,补给站是按位置顺序给出的,且同一个位置最多有1个补给站。
输出描述:
输出一个整数,表示最少花费的金额
示例:
输入:
5 4
0 2
1 3
2 1
3 2
输出:
7 = 2 * 2 + 1 * 3
dp[0] = 0;
import java.util.Scanner;
/**
* 徒步最小花费
* @author WanZi
* @create 2022-03-20 16:52
*/
public class Solution1 {
public static void main(String[] args) {
//键盘输入
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int M = sc.nextInt();
int N = sc.nextInt();
//N行:A B
int[][] nums = new int[N][2];
for(int k = 0;k<N;k++){
nums[k][0] = sc.nextInt();
nums[k][1] = sc.nextInt();
}
//到第i天结束时的消耗最小花费
int[] dp = new int[M+1];
for(int i=1;i<M+1;i++){
int min = Integer.MAX_VALUE / 2;
for(int j=0;j<Math.min(i,N);j++){
min = Math.min(min,(i-j) * nums[j][1] + dp[j]);
}
dp[i] = min;
}
System.out.println(dp[M]);
}
}
}
题二、大小写字符串
小红拿到了—个长度为n的、仅由大小写宁母组成的宁符串。
有q次操作,每次操作可以选择一个区间,将该区间的字母大小写翻转,请你输出最终的字符串。
输入描述:
第一行输入两个正整数n和q。用空格隔开。代表宁符串长度和操作次数。
第二行输入个长度为n的、仅由大小写字母组成的字符串。接下来的q行,每行输入两个正整数l和r,代表小红操作的区间。
输出描述:
输出最终的字符串
示例:
输入:
5 3
aCbqE
1 3
2 5
5 5
输出:
aCbQe
【bug】InputMismatchException的解决
import java.util.ArrayList;
import java.util.Scanner;
/**
* @author WanZi
* @create 2022-03-20 17:48
*/
public class Solution2 {
public static void main(String[] args) {
//键盘输入
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()){
int n = sc.nextInt();
int q = sc.nextInt();
sc.nextLine();
String s = sc.nextLine();
int[][] nums = new int[q][2];
int[] flag = new int[n+1];
for(int i=0;i<q;i++){
/*for (int j = 0; j < 2; j++) {
nums[i][j] = sc.nextInt();
}*/
nums[i][0] = sc.nextInt();
nums[i][1] = sc.nextInt();
//遍历要转换的位置
for (int k = nums[i][0]; k <= nums[i][1]; k++) {
//没转换一次在对应的位置的值加一,最后可以统计出每个位置翻转了几次
// 偶数次相当于不用翻转,奇数次相当于翻转一次;
flag[k] += 1;
}
}
char[] chars = s.toCharArray();
ArrayList<Integer> list = new ArrayList<>();
for(int i=0;i<n+1;i++){
list.add(flag[i]);
System.out.println(list);
}
for (int i = 0; i < n; i++) {
//奇数次则在s相应的位置翻转一次
if (flag[i + 1] % 2 != 0) {
//大写变小写,小写变大写
chars[i] ^= 32;
}
//遍历输出s
System.out.print(chars[i]);
}
}
}
}
题三、模糊回文字符串
我们约定"模糊回文字母串“的定义如下:
对于一个含有英文字母的字符串,如果满足读取规则:
1)读的时候字母不区分大小写;
2)非字母字符均当作同一字符"*“读取;
若从左往石读和从右往左读是一样的,那么就称之为模糊回文字母串。
例如,“a#&A”、“a+b-a”、“abA”、"ab(%BA"均属于模糊回文字母串。
现给定个含有字母的字符串s,请编写个函数判断字符串s经过有限次的字符位置调整后能否变成个模糊回文字母串,若可以则返回true,不可以则返回false。
输入:字符串
输出:true / false
a#&A
true
import java.util.HashMap;
import java.util.Scanner;
/**
* @author WanZi
* @create 2022-03-20 21:07
*/
public class Solution3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
boolean res = isPalidrom(s);
System.out.println(res);
}
public static boolean isPalidrom(String s){
//小写
s = s.toLowerCase();
HashMap<Character,Integer> map = new HashMap<>();
for(int i = 0;i< s.length();i++){
char c;
if('a'<= s.charAt(i) && s.charAt(i) <='z'){
c = s.charAt(i);
}else{
c = '*';
}
map.put(c,map.getOrDefault(c,0)+1);
}
boolean exit = false;
//map.keySet():返回map中所有key值的列表。
for(Character c : map.keySet()){
if(map.get(c) % 2 == 1){
if(exit){
return false;
}else{
exit = true;
}
}
}
return true;
}
}