Teste de código: encontrar o maior número possível

O texto e valores do enunciado em inglês foram ligeiramente alterados para diminuir a chance da solução seja encontrada por alguém que esteja fazendo a prova:

Write a function that, given an integer N, returns the maximum possible value obtainable by deleting one ‘3’ digit from the decimal representation of N.

Examples: Given N = 13938, the function should return 1938.  Given N = -3839, the function should return -389. Given N = -30, the function should return 0. After deleting the ‘3’, the only digits in the number are zeroes, so its value is 0.

Assume that:

    • N is an integer within the range -99999999 to 99999999;
    • N contains at least one ‘3’ digit in its decimal representation;
    • N consists of at least two digits in its decimal representation.

In your solution, focus on correctness. The performance of your solution will not be the focus of the assessment.

Enunciado (resumido) em português

Dado um número inteiro N, retorne o maior valor possível ao remover o dígito 3 do número. Por exemplo: dado N= 393, deve retornar 93. Se N = 3153, retorna 315. Se N= -323, retorna -23. Por fim, se N = -30, retorna 0 (zero).

Assuma que sempre haverá um 3 no valor informado e este valor sempre terá pelo menos duas casas decimais.

Apesar de receber um número inteiro, trata-se de uma questão de parse de strings, uma vez que o valor precisa ser convertido para string para ser alterado (é possível trabalhar apenas com números, mas isto torna a questão muito mais complexa).

Para resolver o problema vamos pegar o valor 3153. Se remover o primeiro “3”, retorna 153, se remover o segundo 315, que é a resposta esperada.

Uma das formas de resolver o problema é identificar as posições da string que possuem o 3 e depois eliminar estas posições (indexes) uma a uma, comparando o resultado, o que gera o seguinte algoritmo em português estruturado

1. Converta o número para string
2. Percora a string identificando as posições onde o valor = 3
3. Armaze as posições num vetor 
4. Inicialize uma variável maiorValor com o menor valor possível
5. Para cada uma das posições do vetor faça
   6. Remova o caracter da posição na string original
   7. Compara o valor de maiorValor com o novo valor gerado
   8. Se o novo valor for maior, armaze no valor em maiorValor
9. Fim do para
10. Retorne o maior valor

A solução em C#

using System;
using System.Collections.Generic;

class Solution {
    //retorna um vetor com as posicoes da string "number" 
    //ocupadas pelo numero 3
    //ex: 635131 retorna [1,4] => a contagem comeca em 0
    private static List<int> GetIndexes(string number) {
        //cria uma lista (que sera retornada)
        var indexes = new List<int>();

        //percore todos os caracteres da string
        //number.Length = 6, para o numero 635131 
        for(int i = 0; i< number.Length; i++) {
            //se caracter = 3, adiciona o indice na lista
            if (number[i] == '3') {
                indexes.Add(i);
            }
        }
        return indexes;
    }

    public int solution(int N) {
        //conver o numero N para uma string
        var originalNumber = N.ToString();
        //pega a lista de indices
        var indexes = GetIndexes(originalNumber);
        //seta o maior valor como o menor inteiro existe
        //assim qualquer valor gerado serah maior q ele
        var maxValue = int.MinValue;

        //percore todos os elementos do vetor
        foreach(var index in indexes) {
           //remove o caracter da posicao armazenada em GetIndexes()
            var number = originalNumber.Remove(index,1);
            //transforma a string num numero inteiro
            var newNumber = int.Parse(number);

            //se o "valor maximo" for menor que o "novo valor"
            //seta o "valor maximo" como sendo o "novo valor"
            if (maxValue < newNumber) {
                maxValue = newNumber;
            }
        }
        return maxValue;
    }
}

 

Origem da questão
País: Irlanda Tipo: Teste de Código Assunto: manipulação de strings
Ramo de negócio da empresa: Pagamentos Grau de Dificuldade: Fácil