enunciados + leetcode
Enunciados como los de una entrevista real para resolver por tu cuenta, con el tiempo que te darían, y problemas de LeetCode recomendados para cada tecnología y seniority. Nada se corrige acá: resolvelo en tu editor, en voz alta, y marcá lo que ya practicaste.
Implementá una pantalla de noticias que carga de a páginas desde un repositorio interface NewsRepository { suspend fun getPage(page: Int): List<Article> }. Hacé un fake que tarda 700 ms, devuelve 20 artículos por página, se queda sin datos en la página 5 y falla aleatoriamente un 20% de las veces.
Cuando el usuario llega cerca del final se carga la página siguiente. Si falla, se muestra un ítem al final con un botón para reintentar, sin perder lo ya cargado.
# requisitos
ViewModel expone un único StateFlow<NewsUiState> modelado con una sealed interface o un data class.LazyListState.# si te sobra tiempo, te van a preguntar
runTest y un dispatcher de test?Implementá una búsqueda de películas que consulta suspend fun search(query: String): List<Movie> a medida que el usuario escribe. El fake tarda entre 100 y 800 ms de forma aleatoria.
El texto del input llega al ViewModel como MutableStateFlow<String>. Armá con operadores de Flow el StateFlow de resultados que consume la UI, sin que nunca se muestren resultados de un query anterior.
# requisitos
distinctUntilChanged.flatMapLatest o mapLatest.stateIn usando SharingStarted.WhileSubscribed(5_000).# si te sobra tiempo, te van a preguntar
WhileSubscribed(5_000) y no Eagerly?StateFlow y SharedFlow?Implementá suspend fun <T> retry(times: Int = 3, initialDelayMs: Long = 500, factor: Double = 2.0, shouldRetry: (Throwable) -> Boolean = { true }, block: suspend () -> T): T.
Ejecuta block y, si falla con un error que shouldRetry acepta, espera y vuelve a intentar con un delay que crece de forma exponencial: 500 ms, 1000 ms, 2000 ms. Si se agotan los intentos, propaga el último error.
# requisitos
delay, no Thread.sleep.CancellationException nunca se reintenta y siempre se propaga.shouldRetry para no reintentar, por ejemplo, un error 400.runTest verificando la cantidad de intentos y los delays.# si te sobra tiempo, te van a preguntar
CancellationException?retryWhen?PriorityQueue o quickselect; mide si conocés las estructuras de la standard library.