【美团】2016研发工程师

[编程题]最大差值

有一个长为n的数组A,求满足0≤a≤b<n的A[b]-A[a]的最大值。

给定数组A及它的大小n,请返回最大差值。

测试样例:

[10,5],2
返回:0

简单题,穷举

import java.util.*;
 
public class LongestDistance {
    public int getDis(int[] A, int n) {
        // write code here
        int max = 0;
        if (n == 1) {
            return 0;
        } else {
            for (int i = 0; i < n; i++) {
                for (int j = i; j < n; j++) {
                    int temp = A[j] - A[i];
                    max = Math.max(temp, max);
                }
            }
        }
        return max;
    }
}

[编程题]棋子翻转
 

在4x4的棋盘上摆满了黑白棋子,黑白两色的位置和数目随机其中左上角坐标为(1,1),右下角坐标为(4,4),现在依次有一些翻转操作,要对一些给定支点坐标为中心的上下左右四个棋子的颜色进行翻转,请计算出翻转后的棋盘颜色。

给定两个数组Af,分别为初始棋盘和翻转位置。其中翻转位置共有3个。请返回翻转后的棋盘。

测试样例:

[[0,0,1,1],[1,0,1,0],[0,1,1,0],[0,0,1,0]],[[2,2],[3,3],[4,4]]
返回:[[0,1,1,1],[0,0,1,0],[0,1,1,0],[0,0,1,0]]

简单题,一开始没有读懂题意,牛客网大佬的答案

链接:https://www.nowcoder.com/questionTerminal/0b5ab6cc51804dd59f9988ad70d8c4a0
来源:牛客网

public static int[][] flipChess(int[][] A, int[][] f) {
        // write code here
        for (int i = 0; i < f.length; i++) {
            int row = f[i][0] - 1;
            int col = f[i][1] - 1;
 
            if (row - 1 >= 0) {
                A[row - 1][col] = (A[row - 1][col] == 0) ? 1 : 0;
            }
 
            if (row + 1 <= 3) {
                A[row + 1][col] = (A[row + 1][col]) == 0 ? 1 : 0;
            }
 
            if (col - 1 >= 0) {
                A[row][col - 1] = (A[row][col - 1]) == 0 ? 1 : 0;
            }
 
            if (col + 1 <= 3) {
                A[row][col + 1] = (A[row][col + 1]) == 0 ? 1 : 0;
            }
        }
        return A;
    }

[编程题]拜访

现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。

给定一个地图map及它的长宽nm,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。

测试样例:

[[0,1,0],[2,0,0]],2,3
返回:2

重点,回溯法,还是有点懵,参考大佬的做法

https://www.nowcoder.com/questionTerminal/12cbdcdf5d1e4059b6ddd420de6342b6

import java.util.*;
  
public class Visit {
  
    static int count = 0;
    public static int countPath(int[][] map, int n, int m) {
        count = 0;
        // write code here
        int x1 = 0,y1 = 0,x2 = 0,y2 = 0;
        int [][]visit = new int[n][m];
        for (int i = 0;i < n;i ++) {
            for (int j = 0;j < m;j ++) {
                if (map[i][j] == 1) {
                    x1 = i;
                    y1 = j;
                }
                if (map[i][j] == 2) {
                    x2 = i;
                    y2 = j;
                }
            }
        }
        int [][]pos = new int[2][2];
        if (x1 <= x2) {
            pos[0][0] = 1;
            pos[0][1] = 0;
        }else {
            pos[0][0] = -1;
            pos[0][1] = 0;
        }
        if (y1 <= y2) {
            pos[1][0] = 0;
            pos[1][1] = 1;
        }else {
            pos[1][0] = 0;
            pos[1][1] = -1;
        }
        dfs(map, x1, y1, visit, pos);
        return count;
    }
    public static void dfs(int[][] map, int row, int col, int [][]visit, int [][]pos) {
  
        if (map[row][col] == 2) {
            count ++;
            return;
        }
  
        for (int i = 0;i < pos.length;i ++) {
            int x = row + pos[i][0];
            int y = col + pos[i][1];
            if (x >= map.length || x < 0 || y >= map[0].length || y < 0)
                continue;
            if (map[x][y] != -1 && visit[x][y] == 0) {
                visit[x][y] = 1;
                dfs(map, x, y, visit, pos);
                visit[x][y] = 0;
            }
        }
    }
}

[编程题]直方图内最大矩形

有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。

给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。

测试样例:

[2,7,9,4,1],5
返回:14

遍历穷举,记下最大值

import java.util.*;
 
public class MaxInnerRec {
    public int countArea(int[] A, int n) {
        // write code here
        int minheight=0;
        int area=0;
        for(int i=0;i<n;i++){
            minheight=A[i];
            for(int j=i+1;j<n;j++){
                minheight=Math.min(A[j], minheight);
                area=Math.max(area, minheight*(j-i+1));
            }
        }
        return area;
    }
}

[编程题]字符串计数

求字典序在s1和s2之间的,长度在len1到len2的字符串的个数,结果mod 1000007。

输入描述:

每组数据包涵s1(长度小于100),s2(长度小于100),len1(小于100000),len2(大于len1,小于100000)


 

输出描述:

输出答案。

示例1

输入

ab ce 1 2

输出

56

还是没有弄太懂,也许可以转换成26进制做

[编程题]平均年龄

已知某公司总人数为W,平均年龄为Y岁(每年3月末计算,同时每年3月初入职新人),假设每年离职率为x,x>0&&x<1,每年保持所有员工总数不变进行招聘,新员工平均年龄21岁。
从今年3月末开始,请实现一个算法,可以计算出第N年后公司员工的平均年龄。(最后结果向上取整)。

输入描述:

输入W Y x N


 

输出描述:

输出第N年后的平均年龄

示例1

输入

5 5 0.2 3

输出

15

注意:每一年新招人的时候,老员工都长了一岁,题目的意思是最后一次向上取整,我的代码每次计算都向上取整了,不改了

错误的每次都向上取整的代码:

import java.util.*;
 
public class Main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        getAge();
    }
 
    public static void getAge(){
        Scanner scanner=new Scanner(System.in);
        //公司人数
        int W=scanner.nextInt();
        //平均年龄
        int Y=scanner.nextInt();
        //离职率
        double rate=scanner.nextDouble();
        //年数
        int year=scanner.nextInt();
         
        int age=Y;
        for(int i=0;i<year;i++){
            age=ageMethod(W, age, rate);
        }
        System.out.println(age);
    }
    //具体计算方法
    public static int ageMethod(int W,int Y,double rate){
        //离职人数=招聘人数
        int newPeople=(int) (rate*W);
        //新平均年龄,过了一年剩下的员工都长了一岁
        int sumAge=(Y+1)*(W-newPeople)+21*newPeople;
        int newAge=0;
        if(sumAge%W==0){
            newAge=sumAge/W;
        }else{
            //向上取整
            newAge=sumAge/W+1;
        }
        return newAge;
    }
 
}

猜你喜欢

转载自blog.csdn.net/wenyimutouren/article/details/81632483