【笔试题】3.20

  • Post author:
  • Post category:其他




题一、徒步行走



题目描述:

小明想从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;
    }
}



版权声明:本文为m0_58058653原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。