字节跳动2019届校招笔试题

本文介绍了一个算法,用于分析世界杯开幕式上球迷群体的分布情况。通过分析M*N的二维球场座位,算法能够找出球场中不同球队球迷群体的数量以及最大群体的人数。采用深度优先搜索策略,遍历每个已选座位,判断其是否属于同一群体,以此来统计群体数量和规模。

1.世界杯开幕式会在球场C举行,球场C的球迷看台可以容纳M*N个球迷。在球场售票完成后,现官方想统计此次开幕式一共有多少个球队球迷群体,最大的球队球迷群体有多少人。

经调研发现,球迷群体在选座时有以下特性:

同球队的球迷群体会选择相邻座位,不同球队的球迷群体会选择不相邻的座位(注解:相邻包括前后相邻,左右相邻,斜对角相邻)

给定一个M*N的二维球场,0代表该位置没有坐人,1代表该位置已有选择,希望输出球队群体个数P,最大的球队群体人数Q

输入描述:

第一行,2个数字,M及N,使用英文逗号分隔

接下来M行,每行N的数字,使用英文逗号分隔

输出描述:

一行,2个数字,P及Q,使用英文逗号分隔

其中P表示球队群体个数,Q表示最大的球队群体人数

例:输入

10,10

0,0,0,0,0,0,0,0,0,0

0,0,0,1,1,0,1,0,0,0

0,1,0,0,0,0,0,1,0,1

1,0,0,0,0,0,0,0,1,1

0,0,0,1,1,1,0,0,0,1

0,0,0,0,0,0,1,0,1,1

0,1,1,0,0,0,0,0,0,0

0,0,0,1,0,1,0,0,0,0

0,0,1,0,0,1,0,0,0,0

0,1,0,0,0,0,0,0,0,0

输出:6,8

java实现:

public class Problem1 {
    static String input = "10,10\n" +
            "0,0,0,0,0,0,0,0,0,0\n" +
            "0,0,0,1,1,0,1,0,0,0\n" +
            "0,1,0,0,0,0,0,1,0,1\n" +
            "1,0,0,0,0,0,0,0,1,1\n" +
            "0,0,0,1,1,1,0,0,0,1\n" +
            "0,0,0,0,0,0,1,0,1,1\n" +
            "0,1,1,0,0,0,0,0,0,0\n" +
            "0,0,0,1,0,1,0,0,0,0\n" +
            "0,0,1,0,0,1,0,0,0,0\n" +
            "0,1,0,0,0,0,0,0,0,0";

    static class Person {
        int num;
        int reach;

        public Person(int num, int reach) {
            this.num = num;
            this.reach = reach;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "num=" + num +
                    ", reach=" + reach +
                    '}';
        }
    }

    static Person[][] handleInput() {
        String[] lines = input.split("\n");
        String[] first = lines[0].split(",");
        int row = Integer.valueOf(first[0]);
        int col = Integer.valueOf(first[1]);
        Person[][] arr = new Person[row][col];
        String[] line;
        for (int i = 1; i < lines.length; i++) {
            line = lines[i].split(",");
            for (int j = 0; j < line.length; j++) {
                arr[i - 1][j] = new Person(Integer.valueOf(line[j]), 0);
            }
        }
        return arr;
    }

    static void searchMaxPerson(Person[][] arr) {
        int row = arr.length;
        int col = arr[0].length;
        int tmp ;
        int max = 0;
        int count = 0;
        Person cur;
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                cur = arr[i][j];
                if (cur.num != 0 && cur.reach == 0) {
                    count ++;
                    tmp = searchAll(arr,i,j);
                    if(tmp > max){
                        max = tmp;
                    }
                }
            }
        }
        System.out.println(count+","+max);
    }

    static int searchAll(Person[][] arr, int r, int c) {
        int row = arr.length;
        int col = arr[0].length;
        if (r >= row || r < 0 || c >= col || c < 0) {
            return 0;
        }
        Person cur = arr[r][c];
        if (cur.num != 0 && cur.reach == 0) {
            cur.reach = 1;
            int n1 = searchAll(arr, r - 1, c) + searchAll(arr, r + 1, c);
            int n2 = searchAll(arr, r - 1, c - 1) + searchAll(arr, r + 1, c + 1);
            int n3 = searchAll(arr, r, c - 1) + searchAll(arr, r, c + 1);
            int n4 = searchAll(arr, r - 1, c + 1) + searchAll(arr, r + 1, c - 1);
            return n1 + n2 + n3 + n4 + 1;
        }
        return 0;
    }

    public static void main(String[] args) {
        Person[][] arr = handleInput();
        searchMaxPerson(arr);
    }
}
字节跳动笔试分专业技能考试和测评类,专业技能一般是技术岗位考,非技术岗位考测评类。以下是一些字节跳动笔试题: - **leetcode原题**:N = int(raw_input()) line = list(map(int, raw_input().split())) count = 0 for i in line: if count == 0: if i >> 3 == 0b11110: count = 3 elif i >> 4 == 0b1110: count = 2 elif i >> 5 == 0b110: count = 1 elif i >> 7 == 0b0: count = 0 else: print 0 else: if i >> 6 == 0b10: count -= 1 else: print 0 print 1 [^2] - **ab序列最长序列**:有一个仅包含’a’和’b’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’a’设置为’b’,或者把一个’b’置成’a’);但是操作的次数有上限m,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。输入描述为第一行两个整数 n , m (1<=m<=n<=50000),第二行为长度为n且只包含’a’和’b’的字符串s。输出描述为输出在操作次数不超过 m 的情况下,能够得到的最大连续全’a’子串或全’b’子串的长度 [^3]。 - **特征提取**:这个题目比较有技巧,首先用pair记录这个特征点{x,y}。如果不使用Map的方法,直接暴力搜索,时间复杂度非常高。这里使用两个map分别记录{x,y}对应的上一次出现的层数,以及{x,y}连续出现的长度。不能直接用Hash表的原因是无法从pair直接map到int。以下为该题的代码: ```cpp #include <iostream> #include <algorithm> #include <map> using namespace std; typedef pair<int, int> PII; int main() { int n, m, res = 0; cin >> n; map<PII, int> LastIndex; map<PII, int> length; for (int i = 1; i <= n; i++) { cin >> m; for (int j = 0; j < m; j++) { PII t; cin >> t.first >> t.second; if (LastIndex[t] == i - 1) { length[t]++; } else if (LastIndex[t] < i - 1) length[t] = 1; LastIndex[t] = i; res = max(res, length[t]); } } cout << res << endl; } ``` [^4]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值