第十五部分 名企笔试真题解析——编程题(持续更新)

15.2 编程题及解析

更新时间:2019.04.24 题目总量:9

以下参考答案均通过在线OJ的审查,符合内存和运行时间要求。

在线编程中,编程语言不限,但以JavaC/C++为主。参考答案以C/Java为主。

15.2.1 坐大巴车(猿辅导笔试真题)

某天猿辅导 HR 组织大家去漂流,早上,参加团建的同学都到齐了,并且按到达公司的先后顺序排好队了。 由于员工太多,一个大巴车坐不下,需要分多个车,车是足够的,但所有人需要按一定顺序上车,按如下规则安排上车的顺序:

假设大巴车容量为 m,从队首开始,每 m 个人分成一个小组,每个小组坐一辆车。同时只有一个车打开车门供员工上车。 小组之间按从队尾到队首顺序依次上车,同一小组内先到的同学先上,求所有人上车的顺序。

 

例如: 员工数 8 车容量 3 员工到达顺序为 1 2 3 4 5 6 7 8 3个人一个小组,分三个小组, 小组一: 1 2 3 小组二: 4 5 6,小组三: 78 小组上车顺序为: 小组三,小组二,小组一 所有员工上车顺序为 7 8 4 5 6 1 2 3

输入描述:

第一行: 员工数和大巴容量

第二行: 所有员工工号(按到达顺序)

 

输出描述:

员工编号

输入例子1:

5 3

1 3 5 2 4

 

输出例子1:

2 4 1 3 5

import java.util.Scanner;

public class Main{

    public static void main(String[] args){

        Scanner sc = new Scanner(System.in);

        int Enum = sc.nextInt();

        int Bnum = sc.nextInt();

        int[] arr = new int[Enum];

        int n = 0;

        for(int i = 0;i

            arr[i] = sc.nextInt();

        }

        for(n = 0;n+Bnum

            int left = n;

            int right = n + Bnum-1;

            while(left < right){

                int temp = arr[left];

                arr[left] = arr[right];

                arr[right] = temp;

                left++;

                right--;

            }

        }

        if(n

            int left = n;

            int right =Enum - 1;

            while(left < right){

                int temp = arr[left];

                arr[left] = arr[right];

                arr[right] = temp;

                left++;

                right--;

            }

        }

        for(int i = Enum-1;i>-1;i--){

            System.out.print(arr[i]);

            if(i!=0){

                System.out.print(" ");

            }

        }

    }

}

 

15.2.2 拍照队形(猿辅导笔试真题)

猿辅导公司的 N位(N>=4)研发同学组织了一次秋游活动,某同学带了个无人机在高空拍照,活动结束时,先拍了一张所有同学排成公司猴头Logo的照片, 接着有人提议再排成“猿”的首字母Y字形来拍一张合照。

用字符串中的每一个字符(不是换行符或结束符'\0')代表一位老师,输出排好后的队形。要求 Y字除去中心点外,上下半部分等高,按照从左到右,从上到下进行排序。队形中没人的部分用空格占位。

输入数据保证可以排出一个完整的Y字,即长度为 3k+1 k>=1

例如: 7 x ,排成队形为(为了方便说明,这里用‘-’代替空格):

x---x

-x-x

--x

--x

--x

输入描述:

输入数据有两行,第一行输入N(N<=1000),表示字符串长度。

第二行输入字符串。

 

输出描述:

用字符串表示的排好的队形,没人处用空格(' ')占位,行尾不能有多余字符,即每行最后一个字符(除了换行符以外),为字符串中代表该老师的字符。

 

 

输入例子1:

4

a3f/

 

输出例子1:

a 3

 f

 /

 

 

 

输入例子2:

7

abcdefg

 

输出例子2:

a   b

 c d

  e

  f

  g

 

输入例子3:

10

iiiiiiiiii

 

输出例子3:

i     i

 i   i

  i i

   i

   i

   i

   i

 

#include

int main(){

    int n;

    char arr[1024]={0};

   

    //接受数据

    scanf("%d",&n);

    getchar();

    for(int i = 0;i

        scanf("%c",arr+i);

    }

    int group = (n-1)/3;

    //对于group可以确定四个指标

    //1、上下分别有几行-group

    //2、两个叉之间的初始间隔-2*group-1

    //3、下方枝的长度group+1

    //4、间隔的变化情况0-group

    int line = group;

    int gap = 2*group-1;

    int height = group+1;

    for(int i = 0 ;i < n ;i++){

        if(i<2*group){

            if(i % 2 == 0){

                for(int j = 0;j < i/2;j++){

                    printf(" ");

                }

                printf("%c",arr[i]);

                continue;

            }

            else{

                for(int j = 0; j< gap ;j++){

                    printf(" ");

                }

                printf("%c\n",arr[i]);

                gap-=2;

                continue;

            }

        }

        for(int j = 0; j< group ;j++){

           printf(" ");

        }

        printf("%c",arr[i]);

        if(i

            printf("\n");

        }

    }

    return 0;

}

 

15.2.3 第二大的数(搜狐畅游笔试真题)

输入n个整数,查找数组中第二大的数 

输入描述:

第一行n表示n个数,第二行n个空格隔开的数

输出描述:

输出第二大的数

输入例子1:

5

1 2 3 4 5

输出例子1:

4

import java.util.*;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        int max = Integer.MIN_VALUE;

        int sec = Integer.MIN_VALUE;

        while(sc.hasNext()){

            int k = sc.nextInt();

            if(k > max) {

                sec = max;

                max = k;

            }

            else if(k > sec) {

                sec = k;

            }

        }

        System.out.println(sec);

    }

}

15.2.4 括号匹配(百度笔试真题)

合法的括号匹配序列被定义为:

1. 空串""是合法的括号序列

2. 如果"X""Y"是合法的序列,那么"XY"也是一个合法的括号序列

3. 如果"X"是一个合法的序列,那么"[X]"也是一个合法的括号序列

4. 每个合法的括号序列都可以由上面的规则生成

例如"", "[]", "[][][]", "[[][]]", "[[[[]]]]"都是合法的。

牛牛现在给出一个括号序列s,牛牛允许你执行的操作是:s的开始和结尾处添加一定数量的左括号('[')

或者右括号(']')使其变为一个合法的括号匹配序列。牛牛希望你能求出添加最少的括号之后的合法的括号

匹配序列是什么。

输入描述:

输入包括一个字符串s,s的长度length(1 length 50),s中只包含'['']'

输出描述:

输出一个字符串,表示括号完全匹配的序列。

输入示例:

][

输出示例:

[][]

import java.util.*;

public class Main{

    public static void main(String[] args){

        Scanner sc = new Scanner(System.in);

       

        char[] str= sc.nextLine().toCharArray();

        int num = 0;

        int left = 0;

        for(int i = 0;i

            if(str[i]=='[')

                num++;

            else if(num == 0)

                left++;

            else

                num--;

        }

        for(int i = 0;i

            System.out.print('[');

        }

        System.out.print(str);

        for(int i = 0;i

            System.out.print(']');

        }

    }

}

15.2.5 比特币买卖最佳时机(招商银行信用卡中心笔试真题)

给定一个正整数数组,它的第 i 个元素是比特币第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一次),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入比特币前卖出。

 

输入描述:

正整数数组,为以空格分隔的n个正整数

输出描述:

最大利润

 

示例1

输入

7 1 5 3 6 4

输出

5

import java.util.*;

public class Main{

    public static void main(String args[]){

        Scanner sc = new Scanner(System.in);

        int[] arr = new int[1024];

        int i=-1;

        while(sc.hasNextInt()){

            i=i+1;

            arr[i] = sc.nextInt();

        }

        int n = i;

        int ret = 0;

        for(i = 0;i

            for(int j = i;j

                ret=ret>(arr[j]-arr[i])?ret:arr[j]-arr[i];

            }

        }

        System.out.println(ret);

    }

}

15.2.6 鸡鸭分类问题(招商银行信用卡中心笔试真题)

 

农场有n只鸡鸭排为一个队伍,鸡用“C”表示,鸭用“D”表示。当鸡鸭挨着时会产生矛盾。需要对所排的队伍进行调整,使鸡鸭各在一边。每次调整只能让相邻的鸡和鸭交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:CCDCC->CCCDC->CCCCD这样就能使之前的两处鸡鸭相邻变为一处鸡鸭相邻,需要调整队形两次。

输入描述:

输入一个长度为N,且只包含CD的非空字符串。

输出描述:

使得最后仅有一对鸡鸭相邻,最少的交换次数

 

示例1

输入

CCDCC

输出

2

import java.util.*;

public class Main{

    public static void main(String args[]){

        Scanner sc = new Scanner(System.in);

        char[] ch = new String(sc.nextLine()).toCharArray();

        char target = ch[0];

        boolean swi = false;

        int pos = -1;

        int ret = 0;

        int i;

        int sum = 0;

        int count = 0;

        for (i=1;i

            if(ch[i]==target && swi ==false) continue;

            if(ch[i]==target && swi ==true){

                ret +=(i-pos);

                count++;

                sum+=(count-1);

            }

            if(ch[i]!=target && swi == false){

                pos = i;

                swi = true;

            }

        }

        if(count == 0){

            System.out.println(0);

        }else{

            System.out.println(ret-sum);

        }

    }

}

15.2.7 X游戏(招商银行信用卡中心笔试真题)

我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。

如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 8 被旋转后仍然是它们自己;2 5 可以互相旋转成对方;6 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。

现在我们有一个正整数 N, 计算从 1 N 中有多少个数 X 是好数?

 

输入描述:

输入正整数N

 

 

输出描述:

输出1N中好数个数

 

示例1

输入

10

输出

4

说明

[1, 10]中有四个好数: 2, 5, 6, 9

注意 1 10 不是好数, 因为他们在旋转之后不变。

import java.util.*;

public class Main{

    public static void main(String args[]){

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        int ret = 0;

        for(int i = 1;i <= n ; i++){

            int temp = i;

            int sum = 0;

            int rev = 0;

            int back = -1;

            int ex = 0;

            while(temp>0){

                int pmin = temp % 10;

                back = -1;

                switch(pmin){

                    case 0:back = 0;break;

                    case 1:back = 1;break;

                    case 2:back = 5;break;

                    case 5:back = 2;break;

                    case 6:back = 9;break;

                    case 8:back = 8;break;

                    case 9:back = 6;break;

                }

                temp = temp / 10;

                if(back == -1) break;

                int pow = 1;

                for(int j = 0 ; j < ex ; j++){

                    pow = pow * 10;

                }

                rev = rev + pow * back;

                ex++;

            }

            if(back == -1) continue;

            if(rev == i) continue;

            ret++;

        }

        System.out.println(ret);

    }

}

15.2.8 黑白矩阵(美团2019春招在线笔试真题)
 

题目概述:

定义一个矩阵为黑白矩阵,当且仅当对于矩阵内的任意一个元素,其上下左右的数字完全一致(如果存在)且不和本身重复

现给出一个矩阵A,给定大小为n*m,内部数据都为整型,请问至少修改矩阵中的几个元素才能使得矩阵A为黑白矩阵?

输入描述:

第一行:n m

之后n行,每行有m个整数,用空格分割

输出描述:

一个整数

输入样例:

3 3

1 1 1

1 1 1

1 1 1

输出样例:

4

输入样例2

3 3

1 1 1

1 5 1

1 1 1

输出样例2

4

输入样例3

3 4

1 2 3 1

2 3 1 2

3 1 2 3

输出样例3

6



import java.util.*;
 
public class TestMain {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        Map map0 = new HashMap<>();
        Map map1 = new HashMap<>();
        int[][] arr = new int[n][m];
        for(int i = 0; i list = new ArrayList<>();
        for(Map.Entry entry:map0.entrySet()){
            Topnum topnum = new Topnum();
            topnum.setKey(entry.getKey());
            topnum.setValue(entry.getValue());
            list.add(topnum);
        }
        list.sort(Comparator.comparingInt(Topnum::getValue));
 
        List  list1 = new ArrayList<>();
        for(Map.Entry entry:map1.entrySet()){
            Topnum topnum = new Topnum();
            topnum.setKey(entry.getKey());
            topnum.setValue(entry.getValue());
            list1.add(topnum);
        }
        list1.sort(Comparator.comparingInt(Topnum::getValue));
        if(list.get(list.size()-1).getKey().equals(list1.get(list1.size()-1).getKey())){
            int left = 0;
            int right = 0;
            if(list1.size()>1){
                left = (m*n+1)/2-list.get(list.size()-1).getValue()+(m*n)/2-list1.get(list1.size()-2).getValue();
            }else{
                left = (m*n+1)/2-list.get(list.size()-1).getValue()+(m*n)/2;
            }
            if(list.size()>1){
                right = (m*n+1)/2-list.get(list.size()-2).getValue()+(m*n)/2-list1.get(list1.size()-1).getValue();
            }else{
                right = (m*n+1)/2+(m*n)/2-list1.get(list1.size()-1).getValue();
            }
            System.out.println(left>right?right:left);
        }else{
            int ret1 = (m*n+1)/2-list.get(list.size()-1).getValue()+(m*n)/2-list1.get(list1.size()-1).getValue();
            System.out.println(ret1);
        }
    }
}
class Topnum {
    private Integer key;
    private Integer value;
 
    public Integer getKey() {
        return key;
    }
 
    public Integer getValue() {
        return value;
    }
 
    public void setKey(Integer key) {
        this.key = key;
    }
 
    public void setValue(Integer value) {
        this.value = value;
    }
}

15.2.9 放置彩球(360安全春招Java后台开发笔试题)

 

小明家有一些彩球,一段时间后小明玩耍时将它们无序的散落在家中,

一天,小明想对其进行整理,规则为一个篮子中只放一种颜色彩球,

可有多个篮子放同一颜色的球,每个篮子里的球不少于2个。

假设小明整理好后,能使各篮子中彩球数量是相同的,则认为小明整理好了。

用一个数字表示一种颜色彩球,一组数表示小明已经找到了的彩球,

问小明用找到的全部彩球能按规则整理好么?

如果可以,输出需要的最少的篮子个数

如果不可以,则输出0

输入说明:

第一行是彩球的个数n

第二行是n个整数 用空格分割表示每个球的颜色保证这n个数字不完全一样。

输入样例:

6

1 1 2 2 2 2

输出样例:

3

import java.util.*;
 
public class TestMain{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Map map = new HashMap<>();
        for(int i = 0;i < n;i++){
            int temp = sc.nextInt();
            int count = 1;
            if(map.get(temp)!= null){
                count = map.get(temp)+1;
            }else{
                count = 1;
            }
            map.put(temp,count);
        }
        if(map.size()==1){
            System.out.println(1);
        }else{
            List list = new ArrayList<>();
            for(Map.Entry entry:map.entrySet()){
                list.add(entry.getValue());
 
            }
            int num = fun(list);
            if(num == 1){
                System.out.println(0);
            }else{
                System.out.println(n/num);
            }
        }
    }
 
    private static int fun(List list) {
        int[] arr = new int[list.size()];
        for(int i = 0;i  i1){
                i = c;
            }else{
                i = i1;
                i1 = c;
            }
            c = i - i1;
        }
        return i1;
    }
}

 

 

你可能感兴趣的:(校招)