У меня есть массив чисел, и я хочу проверить, равно ли число в index 1 числу в index 2, и если да, я хочу увеличить свой счетчик на 1. Я пробовал все, что мог, но не смог придумать правильный логика
это то, что я пробовал до сих пор
let c: [Int] = [0, 0, 0, 0, 1, 0]
for (index, val) in c.enumerated() {
print(val)
var counts = 0
if c.firstIndex(of: index) == c.index(after: index) {
print("yes")
counts += 1
print(counts)
}
}
поэтому, сравнивая 0 index 0 с 0 index 1, счетчик увеличивается на 1,
затем от 0 index 1 до 0 index 2 счетчик увеличивается на 1,
затем от 0 index 2 до 0 index 3 счетчик увеличивается на 1
затем от 0 index 3 до 1 index 4 пропустить,
затем от 0 index 3 до 0 index 5 счетчик увеличивается на 1
я обновил вопрос
значения могут быть только 0 и 1
За всеми, кроме последнего 0 и последнего 1, следует одинаковое число, поэтому вы можете просто вернуть c.count - 2 (при условии, что в массиве есть и нули, и единицы, иначе это c.count - 1)
я не понимаю
ответ на [0, 0, 1, 0, 0, 1, 0] 4 и ответ на 0 0 0 0 1 0 это 3
Давайте продолжить обсуждение в чате.





Пытаться
let c: [Int] = [0, 0, 0, 0, 1, 0]
var counter = 0
var lastIndexOfZero = 0
for index in 1..<c.count {
if c[lastIndexOfZero] == c[index] {
counter += 1
}
if c[index] == 0 {
lastIndexOfZero = index
}
}
print(counter)
Или вы можете просто сделать
// in case your first number is 1
print(c.filter({ $0 == c[0] }).count-1)
Я обновил вопрос. он не возвращает правильный вывод
@King It Does, я только что изменил форму вашего массива [0, 0, 0, 0, 1, 0] на [0, 0, 1, 1, 0, 1, 0]
@King Измени это на то, что ты хочешь
попробуйте [0, 0, 1, 0, 0, 1, 0]
@King Это должно и возвращает 2, попробуйте.
2 неверно, он должен вернуть 4
@King, пожалуйста, обновите вопрос в соответствии с вашим вопросом, он должен возвращать 2, поскольку только индекс 0 и индекс 1 совпадают, а индекс 3 и 4.
да, я обновил вопрос
@King отредактировал ответ
Попробуй это :).
let numbers = [0, 0, 0, 0, 1, 0]
let count = numbers.enumerated().reduce(0) { result, tuple in
let nextOffset = tuple.offset + 1
guard
nextOffset < numbers.count,
numbers[nextOffset] == tuple.element
else {
return result
}
return result + 1
}
print(count)
Это вернет 3 для вашего массива.
если массив равен [0, 0, 1, 0, 0, 1, 0], он возвращает 2, что неверно
Попробуйте с этим:
let c: [Int] = [0, 0, 0, 0, 1, 0]
let numberOfCycles = c.count-2
var count = 0
for i in 0...numberOfCycles {
if c[i] == c[i+1] {
count += 1
}
}
print(count)
это та же проблема, если массив [0, 0, 1, 0, 0, 1, 0], он возвращает 2, что неверно, и должно быть 4
Почему должно быть 4? Найдены индексы 0 и 3, какие другие индексы должны увеличить счетчик?
поскольку индекс 2 равен 3, вы сравниваете индекс 1 с индексом 4.
Я не понимаю, о чем вы спрашиваете, извините, индекс 2 = 1, и я не сравниваю индекс 1 с индексом 4. Я думаю, вам следует переформулировать то, чего вы пытаетесь достичь.
Конкретная проблема в вашем случае заключается в том, что c.firstIndex(of: index) находит первый индекс index в c. Я думаю, вы хотели написать c.firstIndex(of: val), но даже это не сработает. Например, если вы спросите c.firstIndex(of 0), он всегда даст вам 0, даже если вы находитесь на полпути через массив, потому что в вашем тестовом примере первый элемент 0 всегда имеет индекс 0.
Другая проблема заключается в том, что ваш count находится в области цикла, что означает, что каждая итерация получает свою собственную независимую переменную count, инициализированную до 0, которая в лучшем случае будет увеличена до 1 перед повторной инициализацией.
Это идеальный случай для более функционального стиля. Это намного проще, но тоже довольно элементно.
Решение представляет собой цепочку из 4 шагов:
Используйте шаблон zip(a, a.dropFirst()), который для массива a, состоящего из [1, 2, 3, 4, 5], создаст массив пар смежных элементов, например [(1, 2), (2, 3), (3, 4), (4, 5)]
Оттуда нужно проверить каждую из пар, чтобы увидеть, совпадают ли их два элемента. Если это так, мы меняем их на 0, иначе на 1.
Затем мы просто суммируем эти числа, чтобы получить окончательный результат.
В идеале мы упаковываем этот код в функцию и делаем его универсальным, чтобы его можно было легко использовать повторно.
Таким образом мы получаем:
extension Sequence where Element: Equatable {
func countOfAjacentDifferingElements() -> Int {
return zip(self, self.dropFirst())
.lazy
.map { $0 == $1 ? 1 : 0 }
.reduce(0, +)
}
}
let numbers = [0, 0, 0, 0, 1, 0]
print(numbers.countOfAjacentDifferingElements()) // => 2
но [0 0 1 0 0 1 0] дает 2 вместо 4
Хм, я не понимаю, почему он должен давать 4. Здесь всего 2 пары соседних одинаковых элементов, показанных здесь со скобками: [(0 0) 1 (0 0) 1 0]
[a,b,c,d,e,f,g], от a до b, от b до d, от d до e, от e до g]
О, так ты считаешь пары разных элементов? В этом случае вы можете просто поменять местами 0 и 1, чтобы счетчик увеличивался, когда == возвращает false: $0 == $1 ? 0 : 1
да. если это не так, вы переходите к этому значению и сравниваете его со следующим, равным предыдущему значению.