Что мне нужно сделать - простая задача - я зацикливаю массив. Когда array[i] === 0;
я хочу +1
, чтобы start
, это будет то же самое для array[i] === 1
. Но когда array[i]
вернусь (вернуться, где он был мгновение назад) я не хочу +1
, чтобы start
, и я сделал этот код:
var start = 0;
var array = [0,1,0,0,1,0,0,1];
for (i=0; i < array.length; i ++) {
if (array[i] === 0) {
start += 1;
if (array[i + 1] === 1) {
start -= 1;
}
}
else if (array[i] === 1) {
start += 1;
if (array[i + 1] === 0) {
start -= 1;
}
}
}
console.log(start)
Но что, если array = [0,1,1,1,0,0,0,1,0,0,0,1];
, если array[i]
вернется туда, где это было давно? Я не хочу, чтобы +1
start
.
Представьте 0
и 1
как -1
и +1
на диаграмме, поэтому console.log(start)
из array = [0,1,1,1,0,0,0,1,0,0,0,1]
должно быть 5.
Мой код - это какое-то жесткое кодирование, есть ли у вас идеи, как это исправить? Спасибо за ответы заранее!
Пример из комментариев
[0,1,1,1,0,0,0,1,0,0,0,1]
должен давать результат 5; вам нужно представить 0 == -1
и 1 == +1
.
Затем массив выглядит как [-1,+1,+1,+1,-1,-1,-1,+1,-1,-1,-1,+1]
и начинается с 0, у нас 5 позиций, где я был всего 1 раз.
Похоже, вам нужно подсчитать изменения значений в массиве. Вам нужно сохранить последнее значение для проверки следующего значения. Если последнее значение и фактическое значение разные, вы получили изменение и должны подсчитать.
function getChanges(array) {
var count = 0,
last = array[0],
i;
for (i = 1; i < array.length; i++) {
if (last !== array[i]) {
count++;
last = array[i];
}
}
return count;
}
console.log(getChanges([0, 1, 0, 0, 1, 0, 0, 1]));
console.log(getChanges([0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1]));
Как отметил @nurdyguy, ваш вызов array[i+1]
будет за пределами последнего элемента. Я перевернул сравнение с предыдущим элементом и начал цикл на втором элементе, чтобы противостоять этому.
Кажется, вы вычисляете +=1
независимо от двоичного результата, а только -=1
когда следующий элемент в массиве отличается таким образом, что, по сути, я думаю, что вы имеете противоположность тому, что вы ищете:
var start = 0;
var array = [0,1,0,0,1,0,0,1];
for (i=1; i < array.length; i++) {
if (array[i] === array[i-1]) {
start++;
}
}
Теперь, если вы хотите рассчитать времена, когда элемент изменяется с каждого шага, вы можете просто перевернуть логическое:
var start = 0;
var array = [0,1,0,0,1,0,0,1];
for (i=1; i < array.length; i++) {
if (array[i] !== array[i-1]) {
start++;
}
}
console.log("The result is: " + start) // The result is: 5
Я думаю, что это то, что вам нужно, пожалуйста, уточните, если нет.
Редактировать:
Извиняюсь, я проверил ваш другой массив, и результат был также 5.
Что вы ищете, так это:
var start = 0;
var array = [0,1,1,1,0,0,0,1,0,0,0,1];
for (i=0; i < array.length; i++) {
start += array[i];
}
console.log("The result is: " + start) // The result is: 5
Если массив из 0 и 1 является только примером, используйте логический:
var start = 0;
var array = [0,1,1,1,0,0,0,1,0,0,0,1];
for (i=0; i < array.length; i++) {
array[i] == 1 ? ++start : +-start;
}
console.log("The result is: " + start) // The result is: 5
или же:
var start = 0;
var array = [0,1,1,1,0,0,0,1,0,0,0,1];
for (i=0; i < array.length; i++) {
if (array[i] == 1) {
++start
}
}
console.log("The result is: " + start) // The result is: 5
Если массив становится [-1,1,1,1,-1,-1,-1,1,-1,-1,-1,1]
как вы сказали, не 5
, это -3
?
i < array.length
то у вашегоarray[i + 1]
будут проблемы.0, 1
или1,
0, одинаковые значения или только все1
?