2018摩拜算法工程师笔试题

一、字符串变形

输入两个字符串a和b,a的长度小于b的长度。现在可以在a中的每个位置插入任意字符,使得最终a的长度等于b的长度,问最后a和b中对应位置字符不同的位置的个数。

这个问题可以看做是:带约束的最长公共子序列
考虑形如abcx 和ayybc的两个字符串,第一个字符串不能添加太多字符,否则会导致它的长度太长。当a[i]=b[j]时,i必须不能大于j,否则a[i]是不可能等于j的。

这道题测试样例过于简单,以至于很多错误解法也能全部通过。

import java.util.Scanner;

public class Main {
Main() {
    Scanner cin = new Scanner(System.in);
    char[] a = cin.next().trim().toCharArray(), b = cin.next().trim().toCharArray();
    int[][] m = new int[a.length][b.length];
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < b.length; j++) {
            if (i > 0) m[i][j] = Math.max(m[i - 1][j], m[i][j]);
            if (j > 0) m[i][j] = Math.max(m[i][j - 1], m[i][j]);
            if (a[i] == b[j] && a.length - i <= b.length - j && i <= j) {
                int last = 0;
                if (i > 0 && j > 0) last = m[i - 1][j - 1];
                m[i][j] = Math.max(m[i][j], last + 1);
            }
        }
    }
    int common = m[a.length - 1][b.length - 1];
    int add = b.length - a.length;
//    System.out.println(common);
    int ans = b.length - common - add;
    System.out.println(ans);
}

public static void main(String[] args) {
    new Main();
}
}

二、概率+动态规划

N个人,M个礼品,每个礼品的个数为C[i],第i个人选择第j个礼品的概率为p[i][j],当发放礼品时,N个人一次性确定好自己要什么礼品,然后按照顺序一次发放,若某种类型的礼品没了,就不给要这个礼品的人发了。因为礼品个数有限,问期望有多少人能够拿到礼品。

关键在于明白问题转化:期望拿到礼品的人数=每种礼品期望发给的任务。因为人和礼品之间时一一对应的。
定义数组f[M][N],f[i][j]表示第i种礼品被要求次数为j的概率,N从0~N递增推导就可以得到最终矩阵,这个过程相当于滚动数组形式的动态规划。

import java.util.Scanner;

public class Main {
int N, M;
int[] c;
double p[][];
double left[][];

Main() {
    Scanner cin = new Scanner(System.in);
    N = cin.nextInt();
    M = cin.nextInt();
    c = new int[M];
    p = new double[N][M];
    for (int i = 0; i < M; i++) {
        c[i] = cin.nextInt();
        if (c[i] > N) c[i] = N;
    }
    for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) p[i][j] = cin.nextDouble();
    left = new double[M][N + 1];
    for (int i = 0; i < left.length; i++) left[i][0] = 1;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            for (int k = N; k >= 0; k--) {
                left[j][k] = left[j][k] * (1 - p[i][j]);
                if (k > 0) {
                    left[j][k] += left[j][k - 1] * p[i][j];
                }
            }
        }
    }
    double s = 0;
    for (int i = 0; i < M; i++) {
        for (int j = 0; j <= N; j++) {
            s += left[i][j] * Math.min(c[i], j);
        }
    }
    System.out.printf("%.1f", s);
}

public static void main(String[] args) {
    new Main();
}
}

三、数组排序:贪心

一个无序数组,每次只能执行一种操作:把任意一个元素移动到末尾。问最少经过多少次操作能够使得数组变得有序。

对于元素x,只要它后面有比它小的元素,它就必然要被挪到最后去。而对于需要挪到最后去的一批元素,必然是优先移动比较小的那些元素,这样才能保证它们尽量靠前。

import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Main {
Main() {
    Scanner cin = new Scanner(System.in);
    int N = cin.nextInt();
    int[] a = new int[N];
    for (int i = 0; i < N; i++) a[i] = cin.nextInt();
    int s = 0;
    while (true) {
        LinkedList<Integer> left = new LinkedList<>();
        LinkedList<Integer> right = new LinkedList<>();
        int mi = Integer.MAX_VALUE;
        for (int i = a.length - 1; i >= 0; i--) {
            if (mi < a[i]) {
                right.add(a[i]);
            } else {
                left.add(a[i]);
            }
            mi = Math.min(mi, a[i]);
        }
        right.sort(Comparator.comparing(x -> x));
        s += right.size();
        if (right.size() == 0) break;
        int ai = 0;
        for (int i : left) a[N - 1 - right.size() - (ai++)] = i;
        for (int i : right) a[ai++] = i;
    }
    System.out.println(s);
}

public static void main(String[] args) {
    new Main();
}
}

原文地址:https://www.cnblogs.com/weiyinfu/p/9508954.html

时间: 2024-11-07 18:44:31

2018摩拜算法工程师笔试题的相关文章

Java工程师笔试题整理[校招篇]

隔着两个月即将开始校招了.你是不是也想借着这个机会崭露头角,拿到某些大厂的offer,赢取白富美.走上人生巅峰?当然如果你还没能打下Java基础,一定要先打好Java基础:如何一步一步的学Java - 学习编程 - 知乎专栏.然后再来看一下练习一下各大厂的面试笔试题目. 如果以下内容满足不了你,你还可以去看这篇: 2016校招编程题汇总 - 学习编程 - 知乎专栏 进入主要内容(主要内容整理来自牛客网:牛客网)(以下内容按照各大公司进行划分,对每一公司按照年份进行划分,如果想想下载以下内容,可以

搜狗2015C++工程师笔试题解题分析

试卷链接:搜狗2015 C++工程师笔试题. 1.假设整数0x12345678 存放在内存地址0x0开始的连续四个字节中 (即地址0x0到 0x3). 那么在以Little Endian字节序存储的memory中,地址0x3的地方存放的字节是: 0x12 0x34 0x56 0x78 分析:选D.小端法和大端法. a) Little-Endian就是低位字节排放在内存的低地址端, 高位字节排放在内存的高地址端. b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地

2014-07-29 Asp.Net 工程师 笔试题

一.选择题    1.下列描述错误的是() A  类不可以被多重继承而接口可以: B  抽象类自身可以定义成员而接口不可以: C  抽象类和接口都不能被实例化: D   一个类可以继承多个基类和多个基接口: 2.下列哪个名词和WebServices不直接相关() A  UDDI B  GUID C  WSDL D  SOAP 3.下列选项中,()是引用类型 A  enum B struct C  string D  Int 4.声明一个委托 public delegate int myCallB

腾讯web前端开发工程师笔试题及答案

1. 如何实现事件委托? 首先要知道什么是事件委托. 考虑一个列表,在li的数量非常少的时候,为每一个li添加事件侦听当然不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(当然只是一个解释,实际工作中很少遇到这么多li的情况),为每个li添加事件侦听就会对页面性能产生很大的影响. 就像下面这段代码: <!DOCTYPE HTML><html><head><meta charset="utf-8" /><ti

iOS开发工程师笔试题

iOS开发工程师笔试题 分类: IOS 面试题2013-01-17 10:28 820人阅读 评论(0) 收藏 举报 随着iOS平台开发的职位的增加,笔试.面试也越来越有“套路”,这里我总结了一些面试题,多数是Objective-C的基础知识,适合于面试新人,答案是我自己答的,不准确的地方,欢迎指出. 1.   Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? Object-c的类不可以多重继承:可以实现多个接口,通过实

高级软件测试工程师笔试题

1.某目录下所有文件统一批量修改ip 2.获取登陆者自身ip 3.删除某目录下小于10b的文件 4.通过Linux执行MySQL脚本 5.监控某Java进程下所有线程数 6.QTP.watir与selenium的优劣对比 7.什么是回归测试,侧重点是什么 8.什么是场景下考虑性能测试 9.简述安全测试流程 10.a.建class表包括name,id b.插name=wonter,id=1到class表 c.查询id<2的所有名称 d.将以上操作通过存储过程形式写出 e.执行该存储过程 答案一周后

前端试题-2016年阿里前端开发工程师笔试题6,7,8题的解法

2016年阿里前端开发工程师笔试题(只有题,没有答案): http://www.cnblogs.com/sdgf/archive/2015/08/18/4740698.html 第6题:请在____处填写答案,从而达到题目的要求 var arr = [1, 2, 3, 4, 5]; var result = arr.sort(_______________________________).join("+"); console.log(result); 解答:在排序当中,如果需要按照某

2018春招-今日头条笔试题-第三题(python)

题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 本题的做法最重要的应该是如何拼出'1234567890',对于输入表达试获得对应的结果利用python内置函数eval()即可以实现.利用5个字符串来表达'1234567890',如下(为了好看,里面加了tab空格符) '66666 ....6 66666 66666 6...6 66666 66666 66666 66666 66666''6...6 ....6 ....6 ....6 6...6 6.... 6

2018年下半年网络工程师考试试题分析(2)

11: 采用双极型AMI编码进行数据传输,若接收的波形如下图所示,出错的是第( )位. A.2B.5C.7D.9答案:C分析:2005年考过一次,AMI是一种典型的双极性码.在数据流中遇到"1"时,使电平在正和负之间交替翻转,而遇到"0"时,则保持零电平,也就是将信码中的"1"交替编成"+1"和"?1",而"0"保持不变.这相当于三进制信号编码方法,比二进制有更好的抗噪声特性.AMI有其