Maior Sequência
Parte da seção Lógica e Fluxo do Journey de Swift da Coddy — lição 35 de 56.
Uma sequência é um período de dias consecutivos em que um hábito foi marcado como concluído. Para os dias [1, 2, 3, 5, 6], a maior sequência é 3 (dias 1-3).
Calculá-lo uma vez que você tenha uma lista de dias ordenada é uma simples varredura linear: compare cada dia com o anterior, estendendo a sequência atual quando eles forem consecutivos, caso contrário, reinicie.
func longestStreak(_ days: [Int]) -> Int {
let sorted = days.sorted()
var best = 0
var run = 0
var prev: Int? = nil
for d in sorted {
if let p = prev, d == p + 1 {
run += 1
} else {
run = 1
}
if run > best { best = run }
prev = d
}
return best
}O padrão, "rastrear a execução atual + o melhor até agora", se repete em muitos problemas. Reconheça-o uma vez e ele será seu para sempre.
Desafio
MédioLeia uma única linha de entrada: uma lista separada por vírgulas de entradas habit:day. Construa o mesmo dicionário que você fez na lição anterior e, para cada hábito, calcule a maior sequência de dias consecutivos (streak) ao longo da semana.
Imprima os hábitos em ordem alfabética, um por linha, no formato:
<habit>: streak=<n>Para a entrada read:1,read:2,read:3,read:5,workout:2,workout:4, a saída é:
read: streak=3
workout: streak=1Folha de consulta
Maior sequência – varredura linear rastreando a sequência atual e a melhor até agora:
func longestStreak(_ days: [Int]) -> Int {
let sorted = days.sorted()
var best = 0, run = 0
var prev: Int? = nil
for d in sorted {
if let p = prev, d == p + 1 { run += 1 } else { run = 1 }
if run > best { best = run }
prev = d
}
return best
}Os dias são consecutivos quando cada um é igual ao anterior mais um. Redefina run para 1 em caso de lacuna; atualize best a cada iteração.
Experimente você mesmo
var habits: [String: [Int]] = [:]
let ops = readLine()!.components(separatedBy: ",")
for op in ops {
let parts = op.components(separatedBy: ":")
let day = Int(parts[1])!
if !(habits[parts[0], default: []].contains(day)) {
habits[parts[0], default: []].append(day)
}
}
// TODO: maior sequência por hábito, imprimir ordenado por nome como 'name: streak=n'
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings a Fundo
Contagem e ÍndicesCase e TrimBusca em StringsDivisão e JunçãoSubstituindo SubstringsRecapitulação - Verificação de Nome de Usuário4Conjuntos
Criando ConjuntosUnião e InterseçãoSubtração e Diferença SimétricaSubconjunto e SuperconjuntoRecapitulação - Filtro de Tags7Projeto - Monitor de Hábitos
Visão Geral do ProjetoMarcar como Concluído10Projeto - Mecanismo de Quiz
Visão Geral do ProjetoFazer Perguntas2Intervalos e Strides
Fechado vs Meio-AbertoStrideMétodos de IntervaloIntervalos no SwitchRecapitulação - Grade de Calendário5Funções de Ordem Superior Parte 1
MapFilterReduceEncadeando map, filter, reduceRecapitulação - Estatísticas de Palavras