Я всегда слишком усложняю простые задачи и в итоге получаю работающее, но запутанное решение, в то время как оптимальноеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Я всегда слишком усложняю простые задачи и в итоге получаю работающее, но запутанное решение, в то время как оптимальное

Сообщение Anonymous »

Итак, я решал перестановку элементов массива по знаку (LC #2149)

Что я написал:

Код: Выделить всё

public int[] rearrangeArray(int[] nums) {
int nPointer = 0, pPointer = 0;
int[] result = new int[nums.length];

for (int i = 0; i < nums.length / 2; i++) {
while (pPointer < nums.length) {
if (nums[pPointer] > 0) break;
pPointer++;
}
while (nPointer < nums.length) {
if (nums[nPointer] < 0) break;
nPointer++;
}
result[2 * i]     = nums[pPointer++];
result[2 * i + 1] = nums[nPointer++];
}
return result;
}
Фактическое оптимальное решение:

Код: Выделить всё

public int[] rearrangeArray(int[] nums) {
int pos = 0, neg = 1;
int[] result = new int[nums.length];

for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) { result[pos] = nums[i]; pos += 2; }
else              { result[neg] = nums[i]; neg += 2; }
}
return result;
}
Оба являются O(n) временем и O(n) пространством. Оба верны. Но посмотрите на разницу: оптимальное решение просто использует простой трюк с индексом (pos начинается с 0, neg начинается с 1, оба скачут на 2). Я сканировал внутренние циклы while, как будто решал что-то сложное.
Это происходит со мной постоянно. Я смотрю на проблему, мой мозг сразу идет по сложному маршруту.

Как от нее избавиться? или это нормально в первые дни? Мой разум испытывает психологический стресс из-за этой проблемы.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»