2018头条笔试题-世界杯问题

题目:

输入如下面所示:

前一行是m行、n列

后面是这个m行n列的数据,从任意一个1出发,可上下、左右、斜角遍历

要求输出有多少个连通图、连通图中包含的最大连通个数。

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

package algorithm;

import java.util.Scanner;

public class Toutiao {
    public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
            String s1 = sc.next();
            String[] s1Arr= s1.split(",");
            int x = Integer.valueOf(s1Arr[0]);
            int y = Integer.valueOf(s1Arr[1]);
            int[][] a = new int[x][y];
            for(int i = 0; i < x; i++){
                String s = sc.next();
                String[] sArr = s.split(",");
                for(int j = 0;j<y;j++)
                    a[i][j]= Integer.valueOf(sArr[j]);
            }
            int rt[] = new int [2];
            rt=getCount(a,x,y);
        System.out.println(rt[0]);
        System.out.println(rt[1]);
    }

    public static int[] getCount(int[][] A,int x,int y) {
        int a[] = new int [2];
        int max =0;
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < y; j++) {
                if (A[i][j] == 1) {
                    a[0]++;
                    int count = 0;
                    pathcount =0;
                    erase(A, i, j,count);
                    if(pathcount >max)
                        max=pathcount;
                }
            }
        }

        a[1]= max;
        return a;
    }

    public static int  pathcount  =0;
    public static void erase(int[][] A, int i, int j,int count) {
        pathcount++;
        count++;
        A[i][j] = 0;
        while (i - 1 >= 0 && A[i - 1][j] == 1) {  //下
            erase(A, i - 1, j,count);
        }
        while (i + 1 < A.length && A[i + 1][j] == 1) {  // 上
            erase(A, i + 1, j,count);
        }
        while (j - 1 >= 0 && A[i][j - 1] == 1) { //左
            erase(A, i, j - 1,count);
        }
        while (j + 1 < A[0].length && A[i][j + 1] == 1) { //右
            erase(A, i, j + 1,count);
        }
        while (i - 1 >= 0 && j-1 >=0 && A[i-1][j - 1] == 1) { //左上
            erase(A, i-1, j -1,count);
        }
        while (i + 1 < A.length && j+1 <A[0].length && A[i+1][j + 1] == 1) { //右下
            erase(A, i+1, j +1,count);
        }
        while (i - 1 >= 0 && j+1 <A[0].length && A[i-1][j + 1] == 1) { //右上
            erase(A, i-1, j +1,count);
        }
        while (i + 1 < A.length && j-1 >=0 && A[i+1][j - 1] == 1) { //左下
            erase(A, i+1, j -1,count);
        }

    }

}

原文地址:https://www.cnblogs.com/xiangkejin/p/9462637.html

时间: 2024-10-11 21:44:00

2018头条笔试题-世界杯问题的相关文章

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后端第二批

头条笔试题2018后端第二批 标签(空格分隔): 笔试题 描述:为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k.因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1). 输入描述: 输入: 第1行为n代表用户的个数 第2行为n个整数,

网易2018校招笔试题-数组能不能满足重排列后任意相邻的元素积都是4的倍数

今天看了一下网易最新的校招笔试题: 小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]..., A[N]}.牛博士给小易出了一个难题:     对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数.     小易现在需要判断一个数列是否可以重排之后满足牛博士的要求. 代码如下: 1 import java.util.Scanner; 2 3 /** 4 * Created by jy on 2017/9/9. 5

今日头条笔试题--2018(3) 【 优先队列 】

时间限制:1秒 空间限制:81920K 产品经理(PM)有很多好的idea,而这些idea需要程序员实现.现在有N个PM,在某个时间会想出一个 idea,每个 idea 有提出时间.所需时间和优先等级.对于一个PM来说,最想实现的idea首先考虑优先等级高的,相同的情况下优先所需时间最小的,还相同的情况下选择最早想出的,没有 PM 会在同一时刻提出两个 idea. 同时有M个程序员,每个程序员空闲的时候就会查看每个PM尚未执行并且最想完成的一个idea,然后从中挑选出所需时间最小的一个idea独

2017-今日头条笔试题

1 package com.shb.java; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.List; 6 7 /** 8 * 实现将字符串中重复次数打印出来(就是这个意思,原话描述不清了) 9 * @author shaobn 10 * @date 2016-9-28 11 * @package_name com.shb.java 12 */ 13 public class Demo

今日头条笔试题 1~n的每个数,按字典序排完序后,第m个数是什么?

# 由于n和m都是10^18的范围,暴力明显不行,只能dfs了.# 先预处理n的十进制,存到num数组中,长度计算出来为len, 答案存到Num中.# 写个函数cntOfBeginNum(int *Num,int anslen),计算以num为前缀的小于等于n的数的个数cnt,考虑长度比n的十进制长度小的数,则cnt+=1+10+100+1000......# 长度和n相等的则要特判一下,前缀Num和num的前缀有3种关系,> = < ,先判断是哪种,再计算.# 然后考虑答案的最高位非0,我们

2017头条笔试题:二维点集中找出右上角没有点的点并按x坐标从小到大打印坐标

PS:这篇是之前本来就想发的但是一直没时间写,加上今天做了京东的题,结果代码名就命名为jingdong了--懒得改代码名重新跑一遍结果了=.= 暴力法去做就是遍历每个点,判断它是不是"最大点".判断过程则是又遍历一遍,看看是否存在其他点在它右上方,若存在则不是最大点.O(N^2) 但是这样就会有很多不必要的计算,举个例子(这里暂且当坐标都是int),若存在一个最大点(x0,y0),那么所有在它左下角的点都不用考虑了. 另外,对于(x0,y0),只需要查找在它右边(x>x0)的点是

数组元素前移问题(今日头条笔试题)

问题描述:给定一个整数数组和一个整数x,将数组中元素值为x的元素都放到数组的前面,其他元素的相对顺次不变. 例如:原数组为{4,0,1,0,2,,3,6,0,5},x=0,则调整后的数组为{0,0,0,4,1,2,3,6,5} 分析:该问题存在多种解法. 解法一:辅助数组法.创建一个和原数组一样长度的数组,从原数组的尾部开始扫描,如果元素值是x,则忽略. 否则,将元素拷贝到新数组的末尾.扫描完原数组后,再在新数组未重新赋值的元素全部赋值为x. 最后再将新数组的所有元素赋值到原数组中. 假设原数组

2018华为笔试题

题目描述 给定一个整数,给出消除重复数字以后最大的整数 输入描述: 正整数,注意考虑长整数 输出描述 消除重复数字后的最大整数 示例1 输入 423234 输出 432 思路分析 :要保存原来的顺序这个题目才有意思,如果不保存原来的顺序,那直接一个set就搞定了. 很明显这个数字的最大长度不会超过20.怎么暴力都可以了... 思路就是贪心的放每一位ie数字, 比如423234 我们放完第一个4 再放2的时候直接放入,再放3的时候发现前面的2比3小,而且2还有一个剩余,那么我们就用3替换2,一次类