Значения не изменяются внутри цикла foreach - PullRequest
0 голосов
/ 19 декабря 2018

Я родом из C ++, про Python, и недавно начал изучать C #.Но я наткнулся на особую проблему, которую я не могу понять, потратив на это значительное время.Пожалуйста, прости, если это кажется слишком базовым, так как я пробую некоторые вопросы алгоритмического кодирования, чтобы выучить язык.

У меня есть этот код

public class Solution {
    public int SmallestRangeII(int[] A, int K) {
        float mean = A.Sum() / A.Length;
        Console.WriteLine($"the mean is {mean}");

        int mini = int.MinValue;
        int maxi = int.MaxValue;
        foreach(int x in A) {
            int temp = x + ((x - mean) < 0 ? K : -K);
            Console.WriteLine($"{temp}");
            mini = Math.Min(mini, temp);
            maxi = Math.Max(maxi, temp);
            Console.WriteLine($"{mini} and {maxi}");
        }
        Console.WriteLine($"the maximum and minimum values are {maxi} and {mini}");
        return maxi - mini;
    }
}

Когда я передаю аргументы A = [1] и K = 0 при выполнении этого кода, я получаю вывод:

the mean is 1
1
-2147483648 and 2147483647
the maximum and minimum values are 2147483647 and -2147483648

В первой итерации цикла, почему maxi и mini не изменяются на 1 и 1 соответственно?

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

Вы устанавливаете int.MinValue на mini и int.MaxValue на maxi перед foreach методома затем вы вызвали метод Min и Max для получения минимальных и максимальных значений.Следует учитывать, что на первой итерации значение mini равно -2147483648, поэтому вы вызываете метод Min следующим образом:

mini = Math.Min(-2147483648, 1);

Этот метод работает для вас правильно.Если вы хотите установить значение mini на 1, у вас есть несколько вариантов.Одним из них является изменение типа mini и maxi на nullable integer (int?).

int? mini;
int? maxi;

А затем проверьте его значение внутри foreach , как показано ниже:

foreach (int x in A)
{
    int temp = x + ((x - mean) < 0 ? K : -K);
    Console.WriteLine($"{temp}");
    if(mini.HasValue)
        mini = Math.Min(mini.Value, temp);
    else
        mini = temp;

    if(maxi.HasValue)
        maxi = Math.Max(maxi.Value, temp);
    else
        maxi = temp;
    Console.WriteLine($"{mini} and {maxi}");
}
0 голосов
/ 19 декабря 2018

Поскольку mini инициализируется на int.MinValue, Math.Min(mini, temp) всегда будет int.MinValue

Вы, вероятно, хотели инициализировать наоборот: mini с int.MaxValue и maxiс int.MinValue.

0 голосов
/ 19 декабря 2018

Я не знаю, что вы пытаетесь сделать, поэтому я не могу предоставить решение, но если вы посмотрите на свой код, вы увидите, что min = -2 ^ 31 и ваша временная переменная равна единице в случаеВы предоставили.Math.Min из этих двух чисел, очевидно, выбирает меньшее число -> -2 ^ 31.То же самое с максимумом.

Если вы попытаетесь получить самый большой и наименьший nimber в массиве, попробуйте изменить первое назначение ваших min и max на

int min = int.MaxValue();
int max = int.MinValue();

Это приведет к вашемужелаемое решение, я думаю.

0 голосов
/ 19 декабря 2018

Прежде всего,

  • Цикл Foreach будет повторяться только один раз, так как ваш массив содержит один элемент
  • Значение temp рассчитывается как 1.

    int temp = x + ((x - mean) < 0 ? K : -K);

, поскольку значение K равно 0 и добавляется x, то есть 1, согласно вашему вводу.

Если вы хотите получить минимальное и максимальное значение на основе 0, то это даст тот же результат, который вы получили на входе

Лучший способ понять, какое значение хранится в переменной, вы можете использовать Console.WriteLine().Который напечатает результат на консоли для вас.Что-то вроде

   foreach(int x in A) {
        int temp = x + ((x - mean) < 0 ? K : -K);
        Console.WriteLine($"x: "+{x}+"\t mean: "+{mean}+"\t K: "+{K});
        Console.WriteLine($"mini: "+{mini}+"\t maxi: "+{maxi});
        Console.WriteLine($"{temp}");
        mini = Math.Min(mini, temp);
        maxi = Math.Max(maxi, temp);
        Console.WriteLine($"{mini} and {maxi}");
    }

Или отладка вашего кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...