JavaRush/Java блог/Архив info.javarush/Кухня(); Задание N43
terranum
28 уровень

Кухня(); Задание N43

Статья из группы Архив info.javarush
участников
Кухня(); Задание N43 - 1 Правила [Одномерные массивы] 43. Дан массив чисел. Найти сумму элементов массива, расположенных между минимальным и максимальным элементами включительно. Кухня(); Задание N43 - 2
Комментарии (12)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Airon
Уровень 34
15 сентября 2014, 13:17
Вообще то условия задачи не до конца ясны. Если в массиве повторяются min и/или max, то от какого — от самого крайнего слева или самый правый иметь ввиду или тот который больше сумму даст?
Вот по самым первым min и max, понятно что если добавить "=" к >/< будут последние найденные. Возможно еще надо подумать как с макс суммой.
public static int summaMinMax(int... array) {
    int[] minmax = new int[2];
    for (int i = 1; i < array.length; i++)
        minmax = new int[]{array[i] < array[minmax[0]] ? i : minmax[0], array[i] > array[minmax[1]] ? i : minmax[1]};
    minmax = new int[]{minmax[0] < minmax[1] ? minmax[0] : minmax[1], minmax[0] < minmax[1] ? minmax[1] : minmax[0]};
    int summa = 0;
    for (int i = minmax[0]; i <= minmax[1] ; i++)
        summa += array[i];
    return summa;
}
Kashey
Уровень 11
12 сентября 2014, 13:48
public static int sumBetweenMinAndMax(int[] array) {
        int sum = 0;
        int iMin = 0, iMax = 0;
        for (int i = 1; i < array.length; i++) {
            if (array[iMin] > array[i]) iMin = i;   

            if (array[iMax] < array[i]) iMax = i;  
        }
        if(iMax > iMin) for (int i = iMin; i <= iMax; i++) sum += array[i];
        else for (int i = iMax; i <= iMin; i++) sum +=array[i];
        return sum;
}
Docktor91
Уровень 40
10 сентября 2014, 00:26
// for example
public static int getSummBetweenMinAndMax(int[] arr)
{
    int mini = 0;
    int maxi = 0;
    int res = 0;
    for (int i = 1 ; i < arr.length ; i++)
    {
        mini = arr[i] < arr[mini] ? i : mini;
        maxi = arr[i] > arr[maxi] ? i : maxi;
    }
    for (int i = mini > maxi ? maxi : mini; i <= (mini < maxi ? maxi : mini); i++)
        res += arr[i];
    return res;
}
artushenko
Уровень 20
9 сентября 2014, 18:55

        int[] m = {1, 2, 3, 4, 5, 6, 0, 8, 9};
        int minM = m[0];
        int maxM = m[0];
        int indexMin = 0;
        int indexMax = 0;
        int sum = 0;
        for (int i = 0; i < m.length; i++)
        {
            if (m[i] < minM)
            {
                minM = m[i];
                indexMin = i;
            }
            if (m[i] > maxM)
            {
                maxM = m[i];
                indexMax = i;
            }
        }
        for (int i = indexMin; i <= indexMax; i++)
        {
            sum = sum + m[i];
        }
Docktor91
Уровень 40
9 сентября 2014, 23:48
int minM = m[0];
int maxM = m[0];

они здесь не нужны вообще
в последнем цикле, а что если индекс макс стоит ближе к началу, а индекс мин к концу
artushenko
Уровень 20
10 сентября 2014, 00:04
А как же без minM и maxM запомнить max и min элементы, по индексу?
Добавил проверку на индексы, последний цикл теперь выглядит так
<code>
        if (indexMin < indexMax)
        {
            for (int i = indexMin; i <= indexMax; i++)
            {
                sum = sum + m[i];
            }
        } else
        {
            for (int i = indexMin; i >= indexMax; i--)
            {
                sum = sum + m[i];
            }
        }</code>
Docktor91
Уровень 40
10 сентября 2014, 00:06
ахах, да просто, нужно запоминать их индексы, соответственно минимальный и максимальный будет
m[indexMin],m[indexMax]
artushenko
Уровень 20
10 сентября 2014, 00:10
Так и понял)
Вот, что получилось в итоге:
<code>
        int[] m = {1, 2, 3, 4, 5, 6, 0, 8, 9};
        int indexMin = 0;
        int indexMax = 0;
        int sum = 0;
        int i = 0;
        while (i < m.length)
        {
            if (m[i] < m[indexMin])
                indexMin = i;
            
            if (m[i] > m[indexMax])
                indexMax = i;
            i++;
        }
        if (indexMin < indexMax)
        {
            for (int j = indexMin; j <= indexMax; j++)
                sum = sum + m[j];
        } else
        {
            for (int j = indexMin; j >= indexMax; j--)
                sum = sum + m[j];
        }</code>
Docktor91
Уровень 40
10 сентября 2014, 00:16
просто замечательно!
Vash_the_Stampede
Уровень 11
9 сентября 2014, 15:56

    public static void solve(double[] arr) {
        int n = arr.length;
        double[][] sum = new double[n][n];
        int iMin = 0;
        int iMax = 0;
        for (int i = 0; i < n; i++) {
            iMin = arr[i] < arr[iMin] ? i : iMin;
            iMax = arr[i] > arr[iMax] ? i : iMax;
            sum[i][i] = arr[i];
            for (int j = i + 1; j < n; j++) {
                sum[i][j] = sum[j][i] = sum[i][j - 1] + arr[j];
            }
        }
        System.out.println(sum[iMin][iMax]);
    }
Docktor91
Уровень 40
9 сентября 2014, 16:58
как то муторно…
нужно два цикла, один поиск индекса мин-макс,
второй считает от индекса мин до индекса макс
Vash_the_Stampede
Уровень 11
9 сентября 2014, 17:19
знаю, но это банально