Como fazer este código ficar mais rapido?

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;
    }`

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;
}
1 curtida

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);
1 curtida

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:

1 curtida

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

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.

Obrigado pela atenção

Obrigado cara