@Mister_krid

Как можно улучшить код(ревью)?

Задача состояла в том что бы пронумеровать буквы алфавита во входной строке начиная с "a = 1" и найти слово с наибольшим значением(не используя Linq, ток collections.generic и system). Работает четко, но у меня есть подозрения что эти тройные вложенные циклы ваще не круто, хотел бы альтернативу(если есть) ну и вообще на плохие вещи указать.
using System;
using System.Collections.Generic;

namespace CW_Sort_words
{
    public class Kata
    {
        private const string Alphabet = "abcdefghijklmnopqrstuvwxyz";
        public static string Higt(string s)
        {
            string alphabet = Alphabet;
            char[] arrAlphabet = alphabet.ToCharArray();
            string[] word = s.Split(' ');
            int[] value = new int [word.Length];

            for (int i = 0; i < word.Length; i++)
            {                    
                char[] letter = word[i].ToCharArray();

                for (int j = 0; j < letter.Length; j++)
                {
                    for (int b = 0; b < arrAlphabet.Length; b++)
                    {
                        if(letter[j] == arrAlphabet[b])
                        {
                            if (b == 0)     //проверка т.к. отсчет букв идет с 1, а не 0. 
                            {
                                value[i] += 1; 
                                break;
                            }
                            else
                            {
                                value[i] += b + 1;
                                break;
                            }                          
                        }                    
                    }
                }
            }

            return word[MaxIndex(value)];

        }

        //ищем индекс наибольшего значения в массиве
        private static int MaxIndex(int[] array)
        {
            int max = int.MinValue;
            int index = 0;
            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] > max)
                    max = array[i];
            }

            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] == max)
                {
                    index = i;
                    break;
                }
            }
            return index;
        }
    }
    public static class Program
    {
        
        static void Main(string[] args)
        {
            string str = "man i need a taxi up to ubud"; 
            Console.WriteLine(Kata.Higt(str)); //выведет taxi
            
        }
    }
}
  • Вопрос задан
  • 179 просмотров
Решения вопроса 1
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
Если требуется вывести только одно слово с максимальной стоимостью, то можно сделать так:
1. Заменить вашу структуру с проверкой на "Alphabet" на простое приведение символа к целочисленному значению (что-то типа такого: int value = (int)charValue. Если важно, чтобы 'a' = 1, то можно так: int value = charValue - 'a' + 1);
2. Ввести переменные maxIndex (индекс самого дорогого слова в массиве words), maxValue (значение самого дорогого слова в words) и currentValue (стоимость текущего слова); На начальной итерации maxIndex = 0 и maxValue = 0;
3. Вычислить currentValue в цикле, где мы пробегаем по символам слова;
4. Сравнить вычисленную стоимость с максимальной и, если что, поменять значения maxIndex и maxValue на текущие;
5. В конце вернуть words[maxIndex];
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы