Jump to content
  • 0

Работа с массивами и цикл for


Нарек
 Share

Question

Здравствуйте. Есть задача, пройтись по массиву и сортировать так, чтобы все 0 были в конце массива.

Написал такой код

'use strict'var arr = [1, 5, 0, 10, 0, 65, 0];function moveZeros(some) {    let str;    for(let i = 0; i < some.length; i++) {      if(some[i] == 0) {        str = some.splice([i], 1);        some = some.concat(str);      }    }  return some;}console.log(moveZeros(arr));

В данном примере все сортирует правильно, но если массив будет вида скажем [0, 0, 0, 1], то не будет правильно и на выходе получим [0, 1, 0, 0] вместо [1, 0, 0, 0]

 

Например имеем такую ситуацию, что var arr = [0, 0, 0, 1]

Цикл в первый раз пробежался по массиву, первый (нулевой) элемент равен 0, и код будет выполнятся, после чего получим массив уже вида [0, 0, 1, 0]. Вопрос, следующий этап цикла пробежит по массиву [0, 0, 1, 0] или по изначальному [0, 0, 0, 1] ? В чем моя ошибка?

Edited by Нарек
Link to comment
Share on other sites

Recommended Posts

  • 0

Я немножко совсем новичок, давайте чтобы я понял суть, мне посути рабочий код не нужен, это просто задание для самообучения)

 

В последнем примере abrahadabra в моем понимании получается так:

Создаются 2 пустых массива, цикл бегает по основному массиву и если наткнулся на 0 то засовывает его в переменную tail, если не 0 - в переменную result. Потом эти 2 массива склеиваются, tail в конце, то есть все 0 в конце. Все логично, если я правильно читаю и воспринимаю код.

 

да, всё так. Код строго под задачу: из массива выносятся все нули и ставятся в конец.

 

 

В моем изначальном примере что не так?

Допустим для моего примера задан массив [0, 0, 0, 1].

Цикл в первый раз пробежался по массиву, первый (нулевой) элемент равен 0, и код будет выполнятся, после чего получим массив уже вида [0, 0, 1, 0].

второй раз [0, 1, 0, 0], третий раз [1, 0, 0, 0], четвертый раз опять будет [1, 0, 0, 0]. Что я не так понимаю?)

  1. на первом шаге индекс 0. Смотрим на элемент с индексом 0 — он 0. Перемещаем. Получаем. [0, 0, 1, 0]
  2. на втором шаге индекс 1. Смотрим на элемент с индексом 1 — он 0. Перемещаем. Получаем. [0, 1, 0, 0]
  3. на третьем шаге индекс 2. Смотрим на элемент с индексом 2 — он 0. Перемещаем. Получаем. [0, 1, 0, 0]
  4. на четвёртом шаге индекс 3. Смотрим на элемент с индексом 3 — он 0. Перемещаем. Получаем. [0, 1, 0, 0]

здесь всё понятно?

  • Like 1
Link to comment
Share on other sites

  • 0

'use strict'var arr = [0,1,0,1];function moveZeros(some) {  var res = some.sort();  for (var i = 0, n = 0; i < res.length; i++) {    if (res[i] == 0) {      n++;    }  }  var zero = res.splice(0,n);  res = res.concat(zero)  return res;}document.write(moveZeros(arr));

Попробовал написать так.. 

 

P.S. Не использовал let  и строгий режим.. Ни разу не пользовался ими, потому не знаю, верен ли мой вариант... 

 

Хотя да... забыл о приколе с функцией sort....  :(

НУ по первому примеру не совсем то... Там надо использовать ещё 1 функцию для сортировки чисел в меньшую или большую сторону..

'use strict'var arr = [1, 5, 22, 10, 31, 65, 0];function compareNumbers(a,  {  return a - b;}function moveZeros(some) {  var res = some.sort(compareNumbers);  for (var i = 0, n = 0; i < res.length; i++) {    if (res[i] == 0) {      n++;    }  }  var zero = res.splice(0,n);  res = res.concat(zero)  return res;}document.write(moveZeros(arr));
Edited by Q4Dizzy
  • Like 1
Link to comment
Share on other sites

  • 0
str = some.splice(i, 1);str = str.push(some[i]);

оно ли?

Да вроде нет) На выходе мне нужен массив с нулями в конце, надо сам массив менять, str просто вспомогательная переменная у меня.

Link to comment
Share on other sites

  • 0

Так Вы ж не тестируете свой код сначала)

ага, есть такой грешок :)

Предыдущий вариант можно безжалостно в помойку.

Вот теперь протестированный и рабочий вариант:

function moveZeros(some) {    let result = [], tail = [];    for(let i = 0; i < some.length; i++) {        if(some[i] === 0) {            tail.push(some[i]);        } else {            result.push(some[i]);        }    }    return result.concat(tail);}
  • Like 2
Link to comment
Share on other sites

  • 0

Ну тогда подозреваю, что тут дело в нумерации значений массива и номере иттерации после удаления..

 

Тобиш после отработки метода splice номера в массиве поменялись, а цикл продолжается на своём номере.. 

 

о.. отписались уже)) :)

Edited by Q4Dizzy
Link to comment
Share on other sites

  • 0
Он выше написал, что ему не надо сортировать и менять что-либо, кроме 0.

 

Тогда вот так:

var arr = [1, 5, 88, 978, 654, 0, 45, 0, 0, 88, 65];arr.sort(function(a,B){  if(a == 0){    return 1;  }else{    return -1;  }});// на выходе будет [1, 5, 88, 978, 654, 45, 88, 65, 0, 0, 0]

Или короче запись

arr.sort(function(a){return a==0?1:-1;});
Link to comment
Share on other sites

  • 0

Я немножко совсем новичок, давайте чтобы я понял суть, мне посути рабочий код не нужен, это просто задание для самообучения)

 

В последнем примере abrahadabra в моем понимании получается так:

Создаются 2 пустых массива, цикл бегает по основному массиву и если наткнулся на 0 то засовывает его в переменную tail, если не 0 - в переменную result. Потом эти 2 массива склеиваются, tail в конце, то есть все 0 в конце. Все логично, если я правильно читаю и воспринимаю код.

 

В моем изначальном примере что не так? Допустим для моего примера задан массив [0, 0, 0, 1].

Цикл в первый раз пробежался по массиву, первый (нулевой) элемент равен 0, и код будет выполнятся, после чего получим массив уже вида [0, 0, 1, 0]. второй раз [0, 1, 0, 0], третий раз [1, 0, 0, 0], четвертый раз опять будет [1, 0, 0, 0]. Что я не так понимаю?)

Link to comment
Share on other sites

  • 0

 

Оригинальное решение, только в конце имеем не массив.

В смысле?

 

Может неправильно выразился )

В конце получается вот это [4, 8, 15, 16, 23, 42, Array[1], Array[1], Array[1], Array[1], Array[1], Array[1]] вместо вот этого [4, 8, 15, 16, 23, 42, 0,  0,  0,  0,  0,  0]

 

Да и не важно, примеров правильного кода видел уже куча там где дали задание) Мне интересно почему именно мой код не работает, так как я хочу вникать в суть дела)

Edited by Нарек
Link to comment
Share on other sites

  • 0

да нет же! Цикл вообще не по массиву, а по последовательности целых чисел. А уж массив какой есть, к такому и обращаемся на каждом шаге, на каждом же шаге его модифицируя.

Link to comment
Share on other sites

  • 0
var arr = [0, 0, 4, 8, 0, 15, 16, 0, 0, 23, 42, 0] , l = arr.length ; while (l--) { if ( arr[l] === 0 ) { arr.push( arr.splice( l, 1 ) ); } } console.log( arr.join(' ') );

не сортирует))

я бы отделил мух от котлет.  просортировал мух и вернул котлеты ) 

 

var a = [0,0,1,9,0,4,6,6,0],    b = [],    c = []for(i = 0; i<a.length;i++){     a[i] === 0? b.push(0) : c.push(a[i])}c     = c.sort()var d = c.concat(B);alert(d) 
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy