Оптимизировать код поиска и замены элементов массива - C#

Узнай цену своей работы

Формулировка задачи:

Добрый вечер! Подскажите,есть задача Задан Массив из N элементов. Найти все элементы этого массива,которые больше за указанное число k и заменить их на k. Если таких элементов найдено не было,то уменьшать число k на единицу то тех пор,пока невозможно будет заменить хотя бы 1 элемент.
using System;
namespace ConsoleApplication8
{
    class Program
    {
        static void ReadArray(int[] a)//Заполняем массив
        {
            bool error = true;
            Console.WriteLine("Заполняем массив. Введите значения");
            do
            {
                try
                {
                    for (int i = 0; i < a.Length; i++)
                    {
                        a[i] = int.Parse(Console.ReadLine());
                       
                    }
                    error = false;
                }
                catch (Exception r) {
                    Console.WriteLine(r.Message);
                }  
            } while (error);
        }
        static int N() {
            int N = 0;
            bool error = true;
            do
            {
                try
                {
                    Console.WriteLine("Введите размер массива");
                    N = int.Parse(Console.ReadLine());
                    error = false;
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            } while (error||N<0);
            return N;
        }//Вводим N
        static void Logica(int[] a,int k)
        {
 
            int h = 0, c = 0, b = 0;
            for (int i = 0; i <= a.Length - 1; i++)
            {
                if (a[i] > k)
                {
                    a[i] = k;
                    h++;
                }
            }
 
            if (h == 0)
            {
                int max = a[0];
                for (int i = 1; i < a.Length; i++)
                    if (a[i] > max)
                    {
                        max = a[i];
                    }
                b = max;
 
                for (int f = b; f <= k; k--)
                {
                    if (f == k)
                    {
                        c = k - 1;
                    }
                }
 
                for (int i = 1; i <= a.Length - 1; i++)
                {
                    if (a[i] >= max)
                    {
                        a[i] = c;
                    }
                }
            }
 
        }//считаем сколько элементов изменили и присваивание k      
        static void out1(int[] a)
        {
            Console.WriteLine("Масив буде таким");
            for (int i = 0; i < a.Length; i++)
                Console.Write("{0,4} ", a[i]);//С помощью форматирующей строки вывод делаем елементов массива          
        }//вывод
        static int Input() {
            bool error = true;
            int k=0;
            do
            {
                try
                {
                    Console.WriteLine("Введите число k:");
                    k = int.Parse(Console.ReadLine());
                    error = false;
                }
                catch (Exception e) {
                    Console.WriteLine(e.Message);
                }              
            } while (error);
            return k;
        }//Ввод k
        static void Main(string[] args)
        {
            try
            {              
                int k = Input();                
                int[] array = new int[N()];              
                ReadArray(array);              
                Logica(array,k);
                out1(array);
 
            }          
            catch (Exception exe)
            {
                Console.WriteLine(exe.Message);
            }
           
        }
    }
   
}
Вот мой код,но мне нужно оптимизировать
if (h == 0)
            {
                int max = a[0];
                for (int i = 1; i < a.Length; i++)
                    if (a[i] > max)
                    {
                        max = a[i];
                    }
                b = max;
 
                for (int f = b; f <= k; k--)
                {
                    if (f == k)
                    {
                        c = k - 1;
                    }
                }
 
                for (int i = 1; i <= a.Length - 1; i++)
                {
                    if (a[i] >= max)
                    {
                        a[i] = c;
                    }
                }
            }
подскажите правильно,как сделать это 1-2 циклами без поиска максимального значение в массиве. Спасибо заранее.

Решение задачи: «Оптимизировать код поиска и замены элементов массива»

textual
Листинг программы
using System;
using System.Linq;
 
class Program
{
    static void Main()
    {
        int[] arr = Enumerable.Repeat(new Random(), 10).Select(rnd => rnd.Next(100)).ToArray();
        Console.WriteLine(String.Join(", ", arr));
        int k = 95;
        if (!arr.Any(n => n > k))
        {
            k = arr.Max() - 1;
        }
        Console.WriteLine(k);
        arr = arr.Select(n => n > k ? k : n).ToArray();
        Console.WriteLine(String.Join(", ", arr));
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы