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

Asked

Viewed 106 times

1

I’m new to Java and found this problem:

Given a character array ('.' or '#'), your task is to specify the 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 mistake:

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

Can anyone help me? Thank you

3 answers

1

I have already managed to solve the problem, having thought a little differently:

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;

    }


}

0


You reversed the variables i and j in his method output():

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

The correct thing is:

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

0

I suggest a different and more linear approach, still assuming a specific demand 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);
}

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

int valor = m.output(m);

So it becomes more natural just doing:

int valor = m.output();

View execution in Ideone

Testing:

  1. 3 4
    ####
    ..#.
    ##..
    4
    
  2. 4 8
    .....#..
    ##...#..
    .#..###.
    ####.#..
    4
    
  3. 4 2
    #.
    #.
    #.
    ..
    3
    

Browser other questions tagged

You are not signed in. Login or sign up in order to post.