none
Melhorar a performance da linguagem RRS feed

  • Pergunta

  • Pessoal, foi proposto um desafio para mim:

    Entrar com uma string "608000000" e realizar a seguinte maneira:

    De 608000000 para 608999999

    De 107000000 para 107999999

    E consegui fazer na forma abaixo, porém a performance está horrível.

    Alguém que pode me sugerir algo com uma performance muito melhor e mais bonito e utilizando alguma propriedade que é específico para isso.

    Desafio vocês!

    using System;
    using System.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string teste = "608000000 ";
                char[] chars = teste.ToCharArray();
                Array.Reverse(chars);
                string teste2 = string.Empty;
                int id = 0;
    
                while (true)
                {
                    for (int i = 0; i < chars.Count(); i++)
                    {
                        if (chars[i].Equals('0'))
                        {
                            teste2 += "9";
                        }
                        else
                        {
                            id = i;
                            break;
                        }
                    }
    
                    for (int i = id; i < chars.Count(); i++)
                    {
                        teste2 += chars[i].ToString();
                    }
                    break;
                }
    
                char[] chars2 = teste2.ToCharArray();
                Array.Reverse(chars2);
    
                foreach (var tee in chars2)
                {
                    Console.Write(tee);
                }
                Console.ReadLine();
            }
        }
    }


    quinta-feira, 12 de março de 2015 22:26

Respostas

  • Ok, neste caso, faça assim:

      public static string desafioDesafiador(string param)
            { 
                string semOsZeros=param.TrimEnd('0');
                int quantosZerosForamCortados=param.Length-param.TrimEnd('0').Length;
                string comOsNoves = semOsZeros.PadRight(quantosZerosForamCortados+1, '9');
                
    
            
                    return  comOsNoves;
            }
    
    
     static void Main(string[] args)
            {
    
                Console.WriteLine("Digite um numero.");
                string  desafio = Console.ReadLine();
                Console.WriteLine("Desafio de fazer uma operaçao com esse numero {0}", desafioDesafiador(desafio));
                Console.ReadKey();
                }
    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    sexta-feira, 13 de março de 2015 15:44
    Moderador

Todas as Respostas

  • Estranho, seria somente com esses numeros?
     public string metodo1(string valorInformado)
          {
              if (valorInformado == "608000000")
                  return "608999999";
              else if (valorInformado == "107000000")
                  return "107999999";
              else
                  return string.Empty;
            }
    
     public string metodo2(string valorInformado)
           {
               return valorInformado.Replace("00", "99");
           }
    o segundo metodo é mais generico

    Uma imagem vale mais do que mil palavras, mas ocupa 3 mil vezes mais espaço em disco

    quinta-feira, 12 de março de 2015 23:16
  • Então, acho que você não entendeu!

    Eu posso receber qualquer valor, porém os finais que tiverem 0, substituirei por 9. Por exemplo:

    Se eu receber 580400000000, ficará 580499999999;

    Se eu receber 10400000, ficará 10499999;

    os zeros que estiverem no pre-fixo antes do número diferente do zero, não será alterado. Vide exemplo acima.

    sexta-feira, 13 de março de 2015 15:20
  • Ok.. mas qual é o desafio nisso? A regra é sempre modificar os zeros finais por nove? e se vc entrar com 1234567?

    Qual é a regra para 100001? 

    Me desculpe, mas o defasio até agora é entender a regra do desafio.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    sexta-feira, 13 de março de 2015 15:26
    Moderador
  • Ok.. mas qual é o desafio nisso? A regra é sempre modificar os zeros finais por nove? e se vc entrar com 1234567?

    Qual é a regra para 100001? 

    Me desculpe, mas o defasio até agora é entender a regra do desafio.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Exato! Sempre modificar os zeros finais por nove.

    Se entrar com 1234567, não faz nada;

    Se entrar com 100001, não faz nada;

    William, a ideia que estou propondo é melhorar a minha performance do meu código, pois a forma como eu criei está com pouca performance.

    Se você rodar o meu código via console, você verá que funciona perfeitamente.

    sexta-feira, 13 de março de 2015 15:33
  • Ok, neste caso, faça assim:

      public static string desafioDesafiador(string param)
            { 
                string semOsZeros=param.TrimEnd('0');
                int quantosZerosForamCortados=param.Length-param.TrimEnd('0').Length;
                string comOsNoves = semOsZeros.PadRight(quantosZerosForamCortados+1, '9');
                
    
            
                    return  comOsNoves;
            }
    
    
     static void Main(string[] args)
            {
    
                Console.WriteLine("Digite um numero.");
                string  desafio = Console.ReadLine();
                Console.WriteLine("Desafio de fazer uma operaçao com esse numero {0}", desafioDesafiador(desafio));
                Console.ReadKey();
                }
    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    sexta-feira, 13 de março de 2015 15:44
    Moderador
  • Ok, neste caso, faça assim:

      public static string desafioDesafiador(string param)
            { 
                string semOsZeros=param.TrimEnd('0');
                int quantosZerosForamCortados=param.Length-param.TrimEnd('0').Length;
                string comOsNoves = semOsZeros.PadRight(quantosZerosForamCortados+1, '9');
                
    
            
                    return  comOsNoves;
            }
    
    
     static void Main(string[] args)
            {
    
                Console.WriteLine("Digite um numero.");
                string  desafio = Console.ReadLine();
                Console.WriteLine("Desafio de fazer uma operaçao com esse numero {0}", desafioDesafiador(desafio));
                Console.ReadKey();
                }
    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Perfeito! Melhorou muito a performance.

    Só um atento: Sempre vai retornar no final somente UM 9:

                string comOsNoves = semOsZeros.PadRight(quantosZerosForamCortados + 1, '9');
    

    deveria retornar na mesma quantidades de zeros cortados.

    sexta-feira, 13 de março de 2015 15:56
  • Ok, neste caso, faça assim:

      public static string desafioDesafiador(string param)
            { 
                string semOsZeros=param.TrimEnd('0');
                int quantosZerosForamCortados=param.Length-param.TrimEnd('0').Length;
                string comOsNoves = semOsZeros.PadRight(quantosZerosForamCortados+1, '9');
                
    
            
                    return  comOsNoves;
            }
    
    
     static void Main(string[] args)
            {
    
                Console.WriteLine("Digite um numero.");
                string  desafio = Console.ReadLine();
                Console.WriteLine("Desafio de fazer uma operaçao com esse numero {0}", desafioDesafiador(desafio));
                Console.ReadKey();
                }
    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    Cara.. A performance melhorou muito. Só realizei as seguintes alterações:

    string teste = string.Empty;
    
                string prefixo = param.TrimEnd('0');
                int qtdadeSufixo = param.Length - param.TrimEnd('0').Length;
    
                teste = teste .PadRight(qtdadeSufixo, '9');
                teste = prefixo + teste ;
    
    
                return teste ;

    Muito obrigado pela sua atenção!

    sexta-feira, 13 de março de 2015 16:15