美团笔试题

267 阅读3分钟

算法题应该是没有原题的,凭记忆还原个大概。

前面选择题题型:经典给几个数字找规律、数学应用题、数据结构、编译原理(我去这个考的我傻了,什么文法我还没学)、操作系统

第一题

题目:给个字符串,例如aaabb,删除其中的字符,使其不出现偶数长度的回文串,求最小操作次数。

  • 输入:第一行是字符串长度,第二行是字符串

这道题我当时是没想出来的(我只能说很不应该,最近实习很久没写算法题了),暴力过了20%的用例。

  • 思路:偶数回文串的必要条件是要有两个相邻字符相同,所以破坏这个必要条件就可以。

例如:aaabb,把他变成ab。

  • 上代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int n = in.nextInt();   // 字符串长度
        String str = in.next();

        int ans = 0;
        for(int i=1; i<n ; i++){
            if (str.charAt(i) == str.charAt(i-1)) ans++;
        }

        System.out.println(ans);
    }
}

第二题

题目:给个数组,其中有的数字可以移动,有的数字不可以移动。可以移动的数字之间能够做交换操作,要求把这个数组还原成从小到大排序的样子所需要的最小操作次数。

  • 输入:第一行是数组大小,第二行是数组,第三行是可不可以移动(W表示不可移动,R表示可以移动)
  • 例如:

4

1 3 2 4

WRRW

  • 输出:1(交换3和2即可还原)

  • 思路:当时第一道题看了眼没什么想法,第二道题读了下题脑子里大概就有思路了。首先如果不可移动的数字所在的位置不正确,再怎么移动也无法还原,直接输出-1。然后对于位置不对的可以移动的数字,和这个位置本该在的数字现在在的位置交换。

可能说的比较抽象

例如:1 6 9 4 8(假设都可以移动)

6这个位置本该是4,所以他去和4交换 --> 1 4 9 6 8

9这个位置本该是6,所以他去和6交换 --> 1 4 6 9 8

9这个位置本该是8,所以他去和8交换 --> 1 4 6 8 9

所以最少需要的操作次数为3

  • 上代码
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int n = in.nextInt();   // 数组长度
        int[] array = new int[n];   // 数组
        int[] sortArray = new int[n];   // 排序后的数组(方便后续用于比较)
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();    // k:值 v:位置
        String colors = "";

        for (int i=0; i<n; i++){
            array[i] = in.nextInt();
            sortArray[i] = array[i];
            map.put(array[i], i);
        }
        colors = in.next();

        Arrays.sort(sortArray);

        int ans = 0;
        for(int i=0; i<n; i++){
            // 不相等的时候
            if (array[i] != sortArray[i]){
                if (colors.charAt(i) == 'W'){
                    // 无法还原
                    System.out.println("-1");
                    return;
                }
                else{
                    int pos = map.get(sortArray[i]);    // 获取本该在这个位置的数字目前所在的位置
                    if (colors.charAt(pos) == 'W'){
                        // 如果这个位置无法移动, 则还是无法还原
                        System.out.println("-1");
                        return;
                    }
                    else{
                        ans++;
                        // 交换
                        int temp = array[pos];
                        array[pos] = array[i];
                        array[i] = temp;
                        // 记得map的数值也要改!忘记了这个导致我wa了几发
                        map.put(array[i], i);
                        map.put(array[pos], pos);
                    }
                }
            }
        }

        System.out.println(ans);
    }
}