Como fazer este código ficar mais rapido?

7 respostas Resolvido
V

Olá pessoal, preciso fazer com que meu código seja executado em no máximo 3s. só que não sei como substituir as gambiarras que fiz. tem varias transformações de String para int e int para char.

public static int centuryFromYear(int year) {
        String aux;
		String anoString = String.valueOf(year);
		if(year >= 1 && year <= 2005){
            if(year % 10 == 0) {
			    if(year >= 1000) {
				    aux =  anoString.charAt(0) + "" + anoString.charAt(1);
				    return year = Integer.parseInt(aux);
			    }else {
			    	char auxs = anoString.charAt(0);
			    	return year = Character.getNumericValue(auxs);
			    }
		    }else {
                if(year >= 1001) {
                    aux =  anoString.charAt(0) + "" + anoString.charAt(1);
                    return year = Integer.parseInt(aux) + 1;
                }else if(year >= 101) {
                   char auxs = anoString.charAt(0);
                   return year = Character.getNumericValue(auxs) + 1;
                }else{
                	return year = 1;
                }
		    }
        }
		return year;
    }`

7 Respostas

hugokotsubo
Solucao aceita

Não precisa transformar em string e depois de volta para número, provavelmente é isso que deixa o algoritmo lento. Basta usar a boa e velha matemática:

public static int centuryFromYear(int year) {
    return (year / 100) + (year % 100 == 0 ? 0 : 1);
}

Ou seja, divide o ano por 100. Assim, se o ano for por exemplo 1950, o resultado da divisão é 19, se for 2021, a divisão dá 20, etc (a divisão entre inteiros já é arredondada).

Depois, se o ano não for múltiplo de 100, soma 1 (pois 2000 é século 20, e 2001 é século 21).

Para ver se é múltiplo de 100, usei o operador %, que retorna o resto da divisão (aí basta ver se o resto é zero).


Se ficou muito confuso, o código acima seria equivalente a:

public static int centuryFromYear(int year) {
    int sec = year / 100;
    if (year % 100 != 0) // não é múltiplo de 100, soma 1
        return sec + 1;
    return sec;
}
Bambatera

Amigo pelo que eu entendi, você quer saber qual o século passando um ano como parâmetro, se for isso, vc pode fazer da seguinte forma:

/*
     * A regra para descobri o seculo é a seguinte:
     * seculo = (ano / 100) + 1
     * Porém, caso a divisão seja apenas um número inteiro, sem casas decimais,
     * o século é o resultado da divisão, caso contrário, soma-se um ao resultado.
     */
	int ano = 1901;
	double divisao = (ano / 100d); // divide o ano informado por 100 ('d' representa um double)
	int seculo = (int) divisao; // atribui ao seculo apenas o valor inteiro
	if ((divisao - seculo) > 0) { // verifica se as casas decimais são maiores que zero
	    seculo += 1; // soma 1 para atualizar o seculo
	}
	System.out.println(seculo);
hugokotsubo

Não precisa disso. Ao dividir dois int's, o resultado já é convertido para int, então podia dividir por 100 mesmo (sem o d). E pra ver se precisa somar 1, basta ver o resto da divisão por 100 (como eu fiz aí em cima) :slight_smile:

V

mas e se o valor de Year fosse 45 ? teria que dar sec 1
eu tenho que cobrir dês do ano 1 ate 2005. qualquer ano entre este período devo retornar o século

hugokotsubo

Sem querer ser chato, mas… vc chegou a testar o código?

Eu testei, veja: https://ideone.com/sJf8mC :slight_smile:

Se o ano for 45, ao dividir por 100 dá zero. E o resto da divisão não é zero, aí ele soma 1, o resultado é 1.

V

Obrigado pela atenção

V

Obrigado cara

Criado 25 de junho de 2021
Ultima resposta 26 de jun. de 2021
Respostas 7
Participantes 3