Вам дан массив nums длиной n+2, содержащий числа от 0 до n-1. Два числа случайным образом появились в списке дважды. Нужно вернуть эти два числа. Например, для входа
[0][1][1][2][3][3][4] ответ будет [1][3].Для решения можно воспользоваться подсчётом количества появлений каждого числа.
Если встретили число во второй раз — записываем его в ответ:
public int[] GetSneakyNumbers(int[] nums)
{
int n = nums.Length;
int[] count = new int[101];
int[] res = new int[2];
int idx = 0;
foreach (var num in nums)
{
count[num]++;
if (count[num] == 2)
{
res[idx] = num;
idx++;
}
}
return res;
}
При помощи вспомогательного массива считаем, сколько раз встречается каждое число, и когда оно появилось второй раз — запоминаем.
#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🥱4😁1
Дано целое число, нужно проверить, является ли оно полным квадратом.
Первый рефлекс новичка — взять квадратный корень и проверить, целое ли число:
(int)Math.Sqrt(num) * (int)Math.Sqrt(num) == num
Но на собесе после этого последует вопрос: «А можете без встроенной функции?» Вот тогда начинается интересное.
Вместо математики используем логику: если x * x = num, то x находится где-то между 1 и num. Сужаем диапазон поиска, пока не найдём точный ответ.
public bool IsPerfectSquare(int num)
{
long left = 1;
long right = num;
while (left <= right)
{
long mid = (left + right) / 2;
long square = mid * mid;
if (square == num)
return true;
else if (square < num)
left = mid + 1;
else
right = mid - 1;
}
return false;
}
Есть ещё метод Ньютона для поиска корня — он даже быстрее для больших чисел:
public bool IsPerfectSquare(int num)
{
long x = num;
while (x * x > num)
{
x = (x + num / x) / 2;
}
return x * x == num;
}
Главное: объясните почему вы выбрали именно этот подход, а не просто скопировали решение. На собесе вас оценивают не только по скорости, а по способности мыслить.
#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2