Python es uno de los lenguajes de programación más potentes. Nos ofrece una serie de características y funcionalidades únicas que hace que sea sencillo escribir código con él.

En este artículo, vamos a solucionar problemas de arreglos de Leetcode en una sola línea, usando una de las características más interesantes de Python: Comprensión de listas.

¿Qué es Comprensión de listas?

Antes de comenzar con los problemas vamos a estar seguros de que entendemos de qué trata la comprensión de listas:

La comprensión de listas es una construcción sintáctica disponible en algunos lenguajes de programación para crear una lista basada en otras listas existentes.
- Wikipedia -

Veamos cómo funciona la comprensión de listas con un ejemplo.

Consideremos un arreglo de números. Nuestra tarea es la de añadir 1 a los números en los índices impares y añadir 2 a los números en los índices pares

Ahora veremos cómo resolver el problema de arriba usando tanto un for-loop como la comprensión de listas.

Cómo resolver el problema con un bucle for

def addOneAndTwo(nums, n):
    for i in range(n):
        if i % 2 == 1:
            nums[i] += 1 
        else:
            nums[i] += 2 
    return nums

Cómo resolverlo con comprensión de lista

def addOneAndTwo(nums, n):
    return [nums[i] + 1 if i % 2 == 1 else nums[i] + 2 for i in range(n)]

Puedes ver cómo la solución usando comprensión de listas, simplifica esta de 6 líneas a una sola. Este es el poder de comprensión de listas.

Cómo resolver problemas de Leetcode con comprensión de lista.

Ahora, vamos a solucionar los siguientes problemas de Leetcode en una sola línea usando comprensión de lista

1. Mezclar el arreglo.

Este es el enunciado del problema de Leetcode:

Dado el arreglo nums que consiste en 2n elementos en forma

[x1,x2,...,xn,y1,y2,...,yn]. Devolver el arreglo en la forma [x1,y1,x2,y2,...,xn,yn].

Ejemplo:

Input: nums = [2,5,1,3,4,7], n = 3
Output: [2,3,5,4,1,7]

Explicación: Como x1=2, x2=5, x3=1, y1=3, y2=4, y3=7, entonces, la respuesta es [2,3,5,4,1,7].

Solución:

def shuffle(self, nums, n):
    return reduce(lambda a, b: a + b, [[nums[i], nums[j]] for i, j in zip(range(0, n), range(n, 2 * n))])

2. Número de buenas parejas

Dado un arreglo de números enteros nums. Un par (i,j) es llamado bueno si nums[i] == nums[j] y i < j. Devolver el número de buenas parejas

Ejemplo:

Input: nums = [1,2,3,1,1,3]
Output: 4

Explicación: Hay 4 buenas parejas (0,3), (0,4), (3,4), (2,5) de índice 0.

Solución:

def numIdenticalPairs(self, nums):
    return sum([int(i != j and nums[i] == nums[j]) for i in range(0, len(nums)) for j in range(i + 1, len(nums))])

3. Niños con el mayor número de caramelos.

Dado el arreglo candies  y el entero extraCandies, donde candies[i] representa el número de caramelos que tiene el i-ésimo niño.

Por cada niño, chequea si hay alguna forma de distribuir extraCandies entre los niños de forma que puedan tener el mayor número de caramelos entre ellos. Date cuenta de que múltiples niños pueden tener el mayor número de caramelos.

Ejemplo:

Input: candies = [2,3,5,1,3], extraCandies = 3
Output: [true,true,true,false,true]

Explicación: El niño 1 tiene 2 caramelos y, si él recibe todos los caramelos extra (3), él tendrá 5 caramelos, el número mayor de caramelos entre los niños.

El niño 2 tiene 3 caramelos y, si él recibe al menos 2 caramelos extra, entonces, ellos tendrán el número mayor de caramelos entre los niños.

El niño 3 tiene 5 caramelos, que ya es el número mayor de caramelos entre los niños.

El niño 4 tiene 1 caramelo, e incluso recibiendo todos los caramelos extra, tan solo tendrá 4 caramelos.

El niño 5 tiene 3 caramelos, si él recibe al menos 2 caramelos extra entonces ellos tendrán el mayor número de caramelos entre los niños.

Solución:

def kidsWithCandies(self, candies, extraCandies):
    return [candy + extraCandies >= max(candies) for candy in candies]

4. Descompresión de la lista codificada de longitud de ejecución

Estamos dando una lista de enteros denominada nums representando una lista comprimida con la codificación de longitud de ejecución.

Considerando cada par de elementos adyacente [freq, val] = [nums[2*i], nums[2*i+1]] (coni >= 0). Por cada par, existen elementos freq con el valor val concatenado en una sublista. Concatena todas las sublistas de izquierda a derecha para generar la lista descomprimida.

Retorna la lista descomprimida.

Ejemplo:

Input: nums = [1,2,3,4]
Output: [2,4,4,4]

Explicación: El primer par [1,2] significa que tenemos freq = 1 t val = 2, luego generamos el arreglo [2].

El segundo par [3,4] significa que tenemos freq = 3 y val = 4, luego generamos [4,4,4]. Al final la concatenación [2] + [4] es [2,4,4,4].

Solución:

def decompressRLElist(self, nums):
    return reduce(lambda a, b: a + b, [[nums[i + 1]] * nums[i] for i in range(0, len(nums), 2)])

5. La riqueza del cliente más rico.

Dado una cuadrícula de m x n cuentas,  accounts , formada por números enteros donde accounts[i][j] es la cantidad de dinero que el i-ésimo, cliente tiene en el i-ésimo banco. Retornar la riqueza que tiene el cliente más rico.

La riqueza de un cliente es la cantidad de dinero que tiene como suma de todas sus cuentas bancarias. El cliente más rico es aquel que tiene la mayor riqueza

Ejemplo:

Input: accounts = [[1,2,3],[3,2,1]]
Output: 6

Explicación: El primer cliente tiene un valor de riqueza  = 1 + 2 + 3 = 6, el segundo cliente tiene riqueza = 3 + 2 + 1 = 6. Ambos clientes son considerados los más ricos, con un valor 6, luego se retorna 6.

Solución:

def maximumWealth(self, accounts):
    return max([sum(row) for row in accounts])

Conclusión.

Espero que las soluciones anteriores sean útiles. Puedes combinar compresión de listas con otras funciones como map, filter y reduce para hacer que las soluciones sean más simples y efectivas.

Traducido del artículo de Ganesh Kumar Marimuthu - How to Solve Leetcode Problems With Python One-Liners

Gracias ?

Linkedin | Github