Find the size of the largest sequence of # in an array. JAVA

1

I'm new to Java and found this problem:

  

Given an array of characters ('.' or '#'), your task is to indicate the   size of the largest contiguous segment (horizontal or vertical) of   characters '#'

This is my code so far:

import java.util.*;
import java.lang.*;

public class Counting{
    public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    int l = in.nextInt();
    int c = in.nextInt();
    Matrix m = new Matrix(l,c);
    m.ler(in); //ler matriz
    int valor = m.output(m);
    System.out.println(valor);

    }
}

class Matrix {
    char data[][]; //elementos da matriz
    int lin; //nr de linhas
    int col; //nr de colunas

    //construir matriz
    Matrix(int l, int c){
    data = new char[l][c];
    lin = l;
    col = c;
    }

    //ler Matriz

    public void ler(Scanner in){
    for(int i=0;i<lin;i++){
        String c = in.next();
        for(int j=0;j<col;j++){
        data[i][j] = c.charAt(j);
        }
    }
    }

    public int output(Matrix h){

    int linha=0;
    int coluna=0;
    int maior_tamanho=0;
    int maior_tamanhol=0;
    int maior_tamanhoc=0;

    for(int i=0;i<h.lin;i++){
         if(maior_tamanhol<=linha)
        maior_tamanho=linha;        
        linha=0;
        if(maior_tamanhoc<=coluna)
        maior_tamanhoc=coluna;

        coluna=0;    

        for(int j=0;j<h.col;j++){
        if(h.data[i][j]=='#'){
            linha++;

        }

        if(h.data[j][i]=='#'){
            coluna++;

        }
        }
    }
    if(maior_tamanhol>=maior_tamanhoc)
        maior_tamanho=maior_tamanhol;
    else
        maior_tamanho=maior_tamanhoc;

    return maior_tamanho;

    }


}

For input:

3 3
#..
##.
.#.

It gives the right output, which is two:

2

But with this input:

4 8
.....#..
##...#..
.#..###.
####.#..

Give me this error:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at Matrix.output(Counting.java:67)
    at Counting.main(Counting.java:11)

Can anyone help me? Thanks

    
asked by anonymous 18.03.2018 / 12:37

3 answers

0

You have inverted the variables i and j in your output() method:

if(h.data[j][i]=='#'){
    coluna++;
}

The correct one is:

if(h.data[i][j]=='#'){
    coluna++;
}
    
18.03.2018 / 13:32
1

I've been able to solve the problem, thinking in a slightly different way:

import java.util.*;
import java.lang.*;

public class Ex{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int l = in.nextInt();
        int c = in.nextInt();
        Matrix m = new Matrix(l,c);
        m.ler(in); //ler matriz

        int valor = m.output(m);
        System.out.println(valor);

    }
}

class Matrix {
    char data[][]; //elementos da matriz
    int lin; //nr de linhas
    int col; //nr de colunas

    //construir matriz
    Matrix(int l, int c){
        data = new char[l][c];
        lin = l;
        col = c;
    }

    //ler Matriz

    public void ler(Scanner in){
        for(int i=0;i<lin;i++){
            String c = in.next();
            for(int j=0;j<col;j++){
            data[i][j] = c.charAt(j);
            }
        }
    }

    public int output(Matrix h){


        int maior_tamanho=0;
        int maior_tamanhoh=0;
        int maior_tamanhov=0;

        //horizontal
        for(int i=0;i<h.lin;i++){
            int conta=0;
            for(int j=0;j<h.col;j++){
            while(data[i][j]=='#' && j<h.col){
                j++;
                conta++;
                if(j==h.col) break;
            }
            if(conta>maior_tamanhoh){
                maior_tamanhoh=conta;
        }

            conta=0;

            }
        }
        //vertical
        for(int i=0;i<h.col;i++){
            int conta=0;
            for(int j=0;j<h.lin;j++){
            while(data[j][i]=='#'){
                j++;
                conta++;
                if(j==h.lin) break;
            }
            if(conta>maior_tamanhov){
                maior_tamanhov=conta;

            }
        conta=0;

            }
        }

        if(maior_tamanhoh>=maior_tamanhov){
            maior_tamanho=maior_tamanhoh;

        }

        else{
            maior_tamanho=maior_tamanhov;

        }


        return maior_tamanho;

    }


}
    
18.03.2018 / 14:38
0

I suggest a different and more linear approach, assuming in it a specific search for rows and columns.

private int obterMaiorAtualizado(int repeticoes, int maior){
    return repeticoes > maior ? repeticoes: maior;
}

public int output(){
    int maiorLinhas = 0;
    int maiorColunas = 0;

    //linhas
    for(int i = 0;i < lin;i++) {
        int repeticoes = 0;
        for (int j = 0; j < col; ++j) {
            if (data[i][j] == '#') {
                repeticoes++;
            }
            else {
                maiorLinhas = obterMaiorAtualizado(repeticoes, maiorLinhas);
                repeticoes = 0;
            }
        }
        maiorLinhas = obterMaiorAtualizado(repeticoes, maiorLinhas);
    }

    //colunas
    for(int i = 0;i < col; i++) {
        int repeticoes = 0;
        for (int j = 0; j < lin; ++j) {
            if (data[j][i] == '#') {
                repeticoes++;
            }
            else {
                maiorColunas = obterMaiorAtualizado(repeticoes, maiorLinhas);
                repeticoes = 0;
            }
        }
        maiorColunas = obterMaiorAtualizado(repeticoes, maiorLinhas);
    }

    return Math.max(maiorLinhas, maiorColunas);
}

Notice that I removed the input parameter m because the method already runs on Matrix . Soon it would be very strange to call a method passing the object itself as it had in Counting :

int valor = m.output(m);

So it becomes more natural to do just:

int valor = m.output();

View execution on Ideone

Tests:

  • 3 4
    ####
    ..#.
    ##..
    4
    
  • 4 8
    .....#..
    ##...#..
    .#..###.
    ####.#..
    4
    
  • 4 2
    #.
    #.
    #.
    ..
    3
    
  • 18.03.2018 / 15:43