Оптимизировать код поиска и замены элементов массива - C#
Формулировка задачи:
Добрый вечер! Подскажите,есть задача Задан Массив из N элементов. Найти все элементы этого массива,которые больше за указанное число k и заменить их на k. Если таких элементов найдено не было,то уменьшать число k на единицу то тех пор,пока невозможно будет заменить хотя бы 1 элемент.
Вот мой код,но мне нужно оптимизировать
подскажите правильно,как сделать это 1-2 циклами без поиска максимального значение в массиве. Спасибо заранее.
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;
}
}
}Решение задачи: «Оптимизировать код поиска и замены элементов массива»
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));
}
}