笔试题3.20

Posted 王六六的IT日常

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔试题3.20相关的知识,希望对你有一定的参考价值。

题一、徒步行走

题目描述:

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

以上是关于笔试题3.20的主要内容,如果未能解决你的问题,请参考以下文章

美团2016研发工程师笔试题(绑鞋带问题)

第十一届蓝桥杯(国赛)——补给

第十一届蓝桥杯(国赛)——补给

经典PHP笔试题

笔试题Java笔试题知识点

(笔试题)php练习笔试题