Являются ли они «теми же» CodeWars. Мой код не проходит все тесты - PullRequest
0 голосов
/ 07 августа 2020

Условия задачи: Для двух массивов a и b напишите функцию comp (a, b), которая проверяет, имеют ли два массива «одинаковые» элементы с одинаковой кратностью. «Одинаковый» означает здесь, что элементы в b являются элементами в квадрате, независимо от порядка.

Моя функция выглядит так:

public static bool comp(int[] a, int[] b)
        {
            bool result = false;
            if (a == null || b == null)
                return false;
            for (int i = 0; i < b.Length; i++)
            {
                for (int j = 0; j < a.Length; j++)
                {
                    if (Math.Sqrt(b[i]) == a[j])
                    {
                        result = true;
                        break;
                    }
                    result = false;
                }
                if (result == false) break;
            }
            return result;
        }

Но эта функция не t пройти все тесты. Где ошибка в моем коде? И как лучше всего решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 07 августа 2020
            if (a == null || b == null)
                return false;
            for (int i = 0; i < b.Length; i++)
                for (int j = 0; j < a.Length; j++)

Итак, вы проверяете, что все значения из b [] «совпадают» по крайней мере с одним значением в []. Но есть ли значения в [], которые не соответствуют никакому значению в []? Что делать, если массивы разной длины? Или у вас есть повторяющиеся значения?

Math.Sqrt(b[i])

Sqrt медленнее, чем a[i]^2, плюс возвращаемое значение - это double, которое не может точно представить все целые числа. Тогда как насчет отрицательных значений в []?

0 голосов
/ 07 августа 2020

Проблема с вашим кодом заключается в следующем:

for (int i = 0; i < b.Length; i++)
            {
                for (int j = 0; j < a.Length; j++)

Вы выполняете цикл a для каждого значения в b. Тогда ваш код не сможет обработать, если одно и то же значение кратно.
т.е. b = {1,1,2,3,4}; a = {1,2,3,4,5}
Это вернет истину для вашего кода, что явно неверно.

Более того, эта строка действительно плохая:

if (Math.Sqrt(b[i]) == a[j])

Так что же делать? Это довольно просто.

  1. подсчитать каждый массив в словаре, но подсчитать их по-разному.
    1. При подсчете возведите его в квадрат и посчитайте значение в квадрате. ключ словаря = a [i] * a [i]; значение словаря + = 1;
    2. При подсчете b считать как есть. ключ словаря = b; значение словаря - = 1;
  2. Убедитесь, что ваш словарь пуст / заполнен 0.

В Java это становится:

Map<Long, Integer> count = new HashMap<>();
for (int av : a)
{
    long av2 = ((long) av) * av;
    map.put(av2, map.getOrDefault(av2, 0) + 1);
}

for (int bv : b)
{
    map.put(bv, map.getOrDefault(bv, 0) - 1);
}

boolean isEqual = true;
for (long k : count.keySet())
{
    isEqual &= map.get(k) == 0;
}

Замените map на словарь и методы на карте для методов в словаре, и у вас будет c# код.

0 голосов
/ 07 августа 2020

Обратите внимание на последнюю часть описания, regardless of the order. Это говорит о том, что вы не можете предположить, что квадратное значение имеет тот же индекс, что и его источник. Сортировка обоих массивов была бы первым делом, которое я бы попробовал в этом отношении.

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