【笔试题】3.20

这篇博客包含了三个算法问题的解决方案:第一题涉及最小花费的徒步行走,通过动态规划计算最少花费;第二题是字符串大小写的翻转操作,通过遍历和计数实现;第三题是模糊回文字符串的判断,利用哈希表统计字符出现次数判断是否为模糊回文。
摘要由CSDN通过智能技术生成

题一、徒步行走

题目描述:

小明想从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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值