2016-10-11 5 views
1

Что я пытаюсь сделать, так это создать функцию, которая будет переставлять строку чисел от 1234 до 4321. Я уверен, что есть намного более эффективные способы сделать это, чем мой метод, но я просто хочу понять, что пошло не так с тем, что я сделал, потому что я новичок в программировании и могу использовать знания для улучшения.
Моего мыслительный процесса для кода был:Изменение строки чисел от наивысшего до самого низкого C#

  • найти наибольшее число в введенной строке
  • добавить наибольшее число в список
  • удалить наибольшее число из введенной строки
  • находит самое большое число из строки (теперь короче)

Итак, я создал функцию, которая нашла наибольшее число в строке, и она отлично работала:

static int LargestNumber(string num) 
    { 
     int largestnumber = 0; 
     char[] numbers = num.ToCharArray(); 
     foreach (var number in numbers) 
     { 
      int prevNumber = (int) char.GetNumericValue(number); 
      if (prevNumber >= largestnumber) 
      { 
       largestnumber = prevNumber; 
      } 

     } 
     return largestnumber; 
    } 

Теперь функцию перегруппировки является то, что я имею проблемы с:

static List<int> Rearrange(string num) 
    { 
     List<int> rearranged = new List<int>(); // to store rearranged numbers 
     foreach (var number in num) //for every number in the number string 
     { 
      string prevnumber = number.ToString(); // the previous number in the loop 
      if (prevnumber == LargestNumber(num).ToString()) // if the previous number is the larges number in the inputted string (num) 
      { 
       rearranged.Add(Convert.ToInt32(prevnumber)); // put the previous number into the list 

       // removing the previous number (largest) from the inputted string and update the inputted string (which should be now smaller) 
       StringBuilder sb = new StringBuilder(num); 
       sb.Remove(num.IndexOf(number), 1); 
       num = sb.ToString(); 
      } 
     } 
     return rearranged; // return the final rearranged list of numbers 
    } 

Когда я запускаю этот код (фиксированный для конкатенации):

var rearranged = Rearrange("3250"); 
string concat = String.Join(" ", rearranged.ToArray()); 

Console.WriteLine(concat); 

Все, что я получаю :

5 

Я не уверен, что мне не хватает или что я делаю неправильно - код, кажется, не возвращается после удаления «5», который является самым большим числом, а затем удаляет следующий самый высокий номер/

+0

Имеет ли это что-нибудь связанное с [Правило Капрекара] (https://www.reddit.com/r/dailyprogrammer/comments/56tbds/20161010_challenge_287_easy_kaprekars_routine/)? Если это так, вы можете проверить [способ, которым я это сделал] (https://www.reddit.com/r/dailyprogrammer/comments/56tbds/20161010_challenge_287_easy_kaprekars_routine/d8nedm0) :) – itsme86

+0

'var ordered = New String (nums.AsEnumerable () .OrderByDescending (q => Convert.ToInt32 (q)). ToArray()) ' – Plutonix

+2

@Plutonix, конечно, OP не запрашивает решение в инфраструктуре, а скорее то, что не так с их попыткой алгоритма. –

ответ

1

Ваш вопрос Ваше if заявление в вашем цикле.

if (prevnumber == LargestNumber(num).ToString() 
{ 
    rearranged.Add(Convert.ToInt32(prevnumber)); 
    //... 
} 

Вы только когда-либо добавить в свой список rearranged если значение prevnumber это наибольшее значение, которое является ложным для каждого номера, но 5, так что когда-либо будет добавлен в список только значение 5.

Это ответ на вопрос, почему он возвращает только 5, но я не думаю, что это сделает ваш метод правильно работать. Вы делаете очень опасную вещь, изменяя значение коллекции, которую вы итерируете (символы в num) из самого цикла. Для вас были написаны другие ответы, содержащие метод, который перестраивает числа, как вы описали.

+0

. Так что невозможно обновить коллекцию, перебирая ее? – user3124306

+0

@ user3124306 Возможно, и вы это делаете, но это не рекомендуется (и я думаю, что на самом деле это вызывает исключение при итерации над IEnumerable). Когда вы изменяете коллекцию, которую вы повторяете во время итерации, вы потенциально изменяете поведение последующих итераций. Это только общая рекомендация. –

1

Ваш метод Перестановка возвращается List<int>, когда вы пытаетесь написать, что консоль, лучшее, что можно сделать, это написать System.Collections.Generic.List1[System.Int32] (его тип)

Вместо того, чтобы пытаться написать список, преобразовать его первым в тип данных, который может быть написана (строка, например)

например:

var myList = Rearrange("3250"); 
string concat = String.Join(" ", myList.ToArray()); 

Console.WriteLine(concat); 
+0

Дох! Да, я забыл об этом. Мой код не работает, но выдает только 5:/Я не думаю, что правильно реализовал свой метод/алгоритм. – user3124306

1

На основе комментариев к комментариям вы можете проходить через свой список и записывать их на консоль.

например.

foreach(var i in Rearrange(3250)) 
{ 
    console.writeline(i.ToString()); 
} 

или если вы хотите увидеть пример linq.

using system.linq; 
Rearrange(3250).foreach(i => console.writeline(i.ToString())); 

--edit после просмотра вы только получаете «5» выход Это происходит потому, что ваша функция только добавляет номер в список, если они наибольшее число в списке, поэтому 5 только бытие добавлен и возвращен.

0

Просто читать вашу первую фразу
Не проверить целых

static int ReversedNumber(string num) 
    { 
     char[] numbers = num.ToCharArray(); 
     Array.Sort(numbers); 
     Array.Reverse(numbers); 
     Debug.WriteLine(String.Concat(numbers)); 
     return (int.Parse(String.Concat(numbers))); 
    } 
0

Ваш метод Rearrange можно записать легко с помощью Array.Sort(или аналогичный с (List<T>):

int[] Rearrange(int num) 
{ 
    var arr = num.ToString().ToCharArray(); 
    Array.Sort (arr, (d1, d2) => d2 - d1); 
    return Array.ConvertAll (arr, ch => ch - '0'); 
} 
0

Поскольку ваш цикл Еогеасп в методе Перестановка только петля через оригинальный NUM алгоритм не продолжается. чтобы пройти через новую строку num после того, как вы удалили наибольшее число. . Вы можете найти эту проблему, отлаживая эту петлю foreach в Recrange, только 4 раза, если ваша строка ввода «3250».

Смежные вопросы