Risolvere il concorso settimanale Leetcode con ChatGPT
Per questo esperimento, fornirò suggerimenti a ChatGPT sulla base delle domande Leetcode poste nel Weekly Contest 321 (che è stato scelto in modo casuale).
Leggerò le dichiarazioni del problema su Leetcode e le presenterò a ChatGPT. Verrà avviato un nuovo thread di conversazione per ogni problema per evitare interferenze da problemi precedenti.
Se il codice generato non funziona, riproverò e modificherò il prompt per ottenere risultati migliori. Gli obiettivi di questo esperimento sono capire quanto sia accurato il codice e quanto possa essere utile per uno sviluppatore.
Cominciamo.
(Nota che alla fine ho scattato le istantanee di Leetcode dopo l'esperimento rieseguendo il codice)
Problema 1: trova il numero intero pivot
XQ: Dato un numero intero positivo n, trova il numero intero pivot x tale che:
La somma di tutti gli elementi tra 1 e x inclusivamente è uguale alla somma di tutti gli elementi tra x ed n inclusivamente.
Restituisce il numero intero pivot x. Se non esiste un numero intero di questo tipo, restituisce -1. È garantito che ci sarà al massimo un indice pivot per l'input dato.
Esempio 1:
Input: n = 8
Output: 6
Spiegazione: 6 è il numero intero pivot poiché: 1 + 2 + 3 + 4 + 5 + 6 = 6 + 7 + 8 = 21.
Esempio 2:
Input: n = 1
Output: 1
Spiegazione: 1 è il numero intero pivot poiché: 1 = 1.
Esempio 3:
Input: n = 4
Output: -1
Spiegazione: Si può dimostrare che non esiste un numero intero di questo tipo.
Vincoli:
1 <= n <= 1000
Scrivi il codice per risolverlo in Python
ChatGPT : Per risolvere questo problema, possiamo iterare sugli interi da 1 a n e verificare se la somma degli elementi da 1 a x è uguale alla somma degli elementi da x a n per ogni numero intero x. Se questo è il caso, possiamo restituire x. Altrimenti, se raggiungiamo la fine dell'iterazione senza trovare alcun numero intero x che soddisfi la condizione data, possiamo restituire -1 per indicare che tale numero intero non esiste.
Ecco una possibile implementazione di questa soluzione in Python:
def pivot_integer(n: int) -> int:
# Compute the sum of all elements from 1 to n.
total_sum = n * (n + 1) // 2
# Iterate over the integers from 1 to n.
for x in range(1, n + 1):
# Compute the sum of all elements from 1 to x.
left_sum = x * (x + 1) // 2
# Compute the sum of all elements from x to n.
right_sum = total_sum - left_sum
# Check if the sum of the elements from 1 to x equals the sum of the elements from x to n.
if left_sum == right_sum:
return x
# If we reach this point, it means that we didn't find any integer x that satisfies the given condition.
return -1
Ha capito QUASI corretto. Questo risultato è stato come il primo tentativo. L'unica cosa che non capiva era la parola "inclusivo". L'unico errore nel codice era che dovevi aggiungere x mentre calcolavi la somma giusta. (perché X è inclusivo per entrambi i lati).
Problema 2: aggiungi caratteri alla stringa per creare una sottosequenza
XQ: Ti vengono fornite due stringhe, s e t, costituite solo da lettere inglesi minuscole. Una sottosequenza è una stringa che può essere derivata da un'altra stringa eliminando alcuni o nessun carattere senza modificare l'ordine dei caratteri rimanenti. Restituisce il numero minimo di caratteri che devono essere aggiunti alla fine di s in modo che t diventi una sottosequenza di s.
ChatGPT: per trovare il numero minimo di caratteri che devono essere aggiunti alla fine di s in modo che t diventi una sottosequenza di s, possiamo seguire questi passaggi:
- Inizializza una variabile,
count, a 0. Questa variabile verrà utilizzata per memorizzare il numero minimo di caratteri che devono essere aggiunti alla fine di s. - Inizializza due variabili,
iej, a 0. Queste variabili verranno utilizzate per tenere traccia della posizione corrente in ciascuna delle stringhe s e t, rispettivamente. - Itera sui caratteri in s e t, partendo dal primo carattere in ogni stringa. In ogni iterazione, confronta il carattere corrente in s con il carattere corrente in t.
- Se il carattere corrente in s è uguale al carattere corrente in t, incrementa entrambi
iejper passare al carattere successivo in ciascuna stringa. - Se il carattere corrente in s è diverso dal carattere corrente in t, incrementare solo
iper passare al carattere successivo in s. - Ripeti i passaggi 3-5 finché non
iraggiunge la fine di s ojraggiunge la fine di t. - Alla fine dell'iterazione, se
jsi è raggiunta la fine di t, il numero minimo di caratteri che devono essere aggiunti alla fine di s è 0, perché t è già una sottosequenza di s. - Se
jnon ha raggiunto la fine di t, il numero minimo di caratteri che devono essere aggiunti alla fine di s è il numero di caratteri rimanenti in t, che può essere calcolato come la lunghezza di t meno il valore dij.
def minCharactersToAppend(s: str, t: str) -> int:
count = 0
i = 0
j = 0
while i < len(s) and j < len(t):
if s[i] == t[j]:
i += 1
j += 1
else:
i += 1
count = len(t) - j
return count
Verdetto
Secondo tentativo, ha funzionato. Non è stato nemmeno necessario modificare il codice. L'ho copiato incollato e inviato e ha superato tutti i casi di test. È stato super veloce per me.
Problema 3: rimuovere i nodi dall'elenco collegato
XQ: Ti viene data la testa di una lista collegata. Rimuovi ogni nodo che ha un nodo con un valore strettamente maggiore ovunque sul lato destro di esso. Restituisce l'intestazione dell'elenco collegato modificato.
Esempio 1:
Input: head = [5,2,13,3,8]
Output: [13,8]
Spiegazione: I nodi da rimuovere sono 5, 2 e 3. — Il nodo 13 è a destra del nodo 5 . — Il nodo 13 è a destra del nodo 2. — Il nodo 8 è a destra del nodo 3.
Esempio 2:
Input: head = [1,1,1,1]
Output: [1,1,1,1]
Spiegazione: Ogni nodo ha valore 1, quindi nessun nodo viene rimosso. Vincoli: il numero dei nodi nell'elenco dato è compreso nell'intervallo [1, 105]. 1 <= Nodo.val <= 105
ChatGPT: Ecco un approccio semplice che risolve questo problema nella complessità lineare del tempo e dello spazio:
- Scorri l'elenco collegato e memorizza il valore di ogni nodo in un array.
- Scorri l'array da destra a sinistra e rimuovi ogni elemento che è più piccolo del valore massimo visto finora.
- Costruire un nuovo elenco collegato dall'array modificato e restituire l'inizio dell'elenco collegato.
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNodes(self, head: ListNode) -> ListNode:
# Store all nodes' values in an array
arr = []
curr = head
while curr:
arr.append(curr.val)
curr = curr.next
# Iterate over the array from right to left, and remove each element that is smaller than the maximum value seen so far
mx = -1
i = len(arr) - 1
while i >= 0:
if arr[i] > mx:
mx = arr[i]
else:
arr.pop(i)
i -= 1
# Construct a new linked list from the modified array and return the head of the linked list
dummy = curr = ListNode(-1)
for x in arr:
curr.next = ListNode(x)
curr = curr.next
return dummy.next
Verdetto
Ancora una volta, diventa quasi corretto. C'è un piccolo errore nel codice. Durante l'iterazione dell'array da destra a sinistra, la condizione if dovrebbe essere if arr[i] >= mxe non solo "maggiore di".
Ho apportato tale modifica e inviato il codice, che ha superato tutti i casi di test. Questo è stato un secondo tentativo. La prima volta non ho incluso gli esempi nel prompt, che non ha dato il risultato desiderato. Quindi ho iniziato un nuovo thread con l'intera domanda che l'ha (quasi) risolto senza problemi.
Problema 4: contare i sottoarray con la mediana K
XQ: Ti viene fornito un array nums di dimensione n costituito da numeri interi distinti da 1 a n e un numero intero positivo k. Restituisce il numero di sottoarray non vuoti in num che hanno una mediana uguale a k.
ChatGPT: per trovare il numero di sottoarray non vuoti di numsche hanno una mediana uguale a k, possiamo iterare su tutti i possibili sottoarray di numse verificare se la mediana di ogni sottoarray è uguale a k.
Per trovare la mediana di un sottoarray, dobbiamo prima ordinare il sottoarray in ordine crescente. Se la lunghezza del sottoarray è dispari, la mediana è semplicemente l'elemento centrale del sottoarray ordinato. Se la lunghezza del sottoarray è pari, la mediana è la media dei due elementi centrali del sottoarray ordinato.
Una volta che abbiamo la mediana di un sottoarray, possiamo verificare se è uguale a ke incrementare un contatore se lo è. Dopo aver iterato su tutti i possibili sottoarray, possiamo restituire come risultato il valore finale del contatore.
Ecco un codice di esempio per trovare il numero di sottoarray non vuoti numsche hanno una mediana uguale a k:
def count_medians(nums, k):
n = len(nums)
count = 0
# Iterate over all possible subarrays of nums
for i in range(n):
for j in range(i+1, n+1):
# Sort the current subarray in ascending order
subarray = sorted(nums[i:j])
# Find the median of the current subarray
if len(subarray) % 2 == 0:
median = (subarray[len(subarray)//2 - 1] + subarray[len(subarray)//2]) / 2
else:
median = subarray[len(subarray)//2]
# Increment the counter if the median is equal to k
if median == k:
count += 1
return count
Verdetto
L'approccio della forza bruta fornito da ChatGPT è quasi corretto. È richiesta solo 1 riga di modifica del codice.
# Find the median of the current subarray
if len(subarray) % 2 == 0:
median = subarray[len(subarray)//2 - 1]
Questo è un problema difficile di Leetcode e ho avuto difficoltà a ottenere una risposta utilizzando ChatGPT, a differenza delle altre tre domande. La soluzione principale che condivideva era semplice. Tuttavia, fargli scrivere la soluzione ottimizzata corretta è stato piuttosto difficile. Ho provato alcune cose e poi ho rinunciato perché stava diventando contorto.
Verdetto finale
- Ha dato risposte soddisfacenti per 3/4 domande nel concorso settimanale, il che è piuttosto impressionante. Ciò lo rende migliore di molti partecipanti al concorso.
- In qualità di sviluppatore con conoscenze pregresse, il tempo per arrivare alla soluzione funzionante è stato piuttosto rapido. In genere, un problema che mi avrebbe richiesto 10 minuti richiede solo 2-3 minuti ora.
- ChatGPT da solo potrebbe non essere molto utile nell'affrontare problemi complessi a meno che l'utente non aggiunga le proprie conoscenze e il proprio valore per aiutarlo a risolvere il problema.
- No, non ti toglierà il lavoro. È come un assistente personale che ti aiuta a programmare 10 volte più velocemente.
- Bisogna stare attenti a verificare la correttezza delle risposte che dà in quanto appaiono inaffidabili come fonte di verità.
- Le spiegazioni che fornisce agli algoritmi sono stimolanti e possono aiutare gli sviluppatori con la loro intuizione.
- Trovo ChatGPT più simile a un simulatore. Simula cose in un linguaggio coerente. È abbastanza bravo a collegare i punti e gli schemi, ma probabilmente non capisce cosa significa.
Ecco la mia opinione attuale.
Da quello che ho visto, ChatGPT alza l'asticella per l'estremità inferiore dello skillset. Supponiamo che tutti abbiano un livello di abilità da 0 a 100. Con ChatGPT, il livello più basso probabilmente sale a 30. Ora, tutti hanno un livello di abilità da 30 a 100. Alla fine, è ancora una parità di condizioni quando tutti hanno accesso a esso.
Forse aiuterà qualcuno che è un principiante a diventare 10 volte più efficiente. Tuttavia, potrebbe essere una spinta di 100 volte per un esperto in materia poiché comprende le cose per spingere meglio ChatGPT e combinare idee per raggiungere dove vogliono. Saranno anche veloci nell'identificare gli errori e correggerli.
Posta crediti
Rendiamo le cose un po' meta :P
XQ: Scrivi un articolo sul blog su "Risolvere il concorso settimanale Leetcode con ChatGPT". Fornisci alcuni esempi di ChatGPT che risolvono con successo le domande su Leetcode. Mostra anche dove ChatGPT non riesce a risolvere.
ChatGPT: Se sei un ingegnere del software o uno scienziato dei dati, è probabile che tu abbia familiarità con Leetcode, la popolare piattaforma per esercitarsi nella codifica e nella risoluzione di problemi algoritmici. Uno dei momenti salienti dell'esperienza Leetcode è il concorso settimanale, in cui gli utenti possono mettere alla prova le proprie abilità contro altri utenti e competere per i premi.
Risolvere i problemi di Leetcode può essere un compito impegnativo e dispendioso in termini di tempo, soprattutto quando si tratta del concorso settimanale. È qui che entra in gioco ChatGPT. ChatGPT è un chatbot basato sull'intelligenza artificiale che può aiutarti a risolvere i problemi di Leetcode in tempo reale, fornendoti soluzioni dettagliate e suggerimenti utili lungo il percorso.
Ecco alcuni esempi di ChatGPT che risolvono con successo le domande su Leetcode:
- Two Sum: questo è un classico problema Leetcode che ti chiede di trovare due numeri in un array che si sommano a un numero target specifico. ChatGPT è stato in grado di risolvere rapidamente questo problema fornendo una soluzione passo-passo che prevedeva la creazione di una mappa per memorizzare gli indici dei numeri nell'array e quindi l'iterazione dell'array per trovare i due numeri che si sommano al target.
- Reverse Integer: questo problema richiede di invertire un numero intero senza utilizzare alcuna funzione o libreria incorporata. ChatGPT ha fornito una soluzione che prevedeva l'utilizzo di un ciclo while per scorrere le cifre del numero intero, aggiungendo ciascuna cifra a una stringa e quindi invertendo la stringa alla fine per ottenere il numero intero invertito.
- Unisci due elenchi ordinati: questo problema richiede di unire due elenchi collegati ordinati in un elenco collegato ordinato. ChatGPT ha fornito una soluzione che prevedeva la creazione di un nuovo elenco collegato e quindi l'iterazione dei due elenchi collegati di input, confrontando i valori in ciascun nodo e aggiungendo il valore più piccolo al nuovo elenco collegato.
Nel complesso, ChatGPT è uno strumento prezioso per risolvere i problemi di Leetcode, in particolare quando si tratta del concorso settimanale. Le sue soluzioni passo-passo e i suggerimenti utili possono farti risparmiare tempo e fatica, permettendoti di concentrarti sui problemi più impegnativi e migliorare le tue capacità di ingegnere del software o data scientist.
Questo è ciò che intendo quando dico che sembra un simulatore. Nota come simula ChatGPT che non riesce a risolvere il "numero palindromo" semplicemente perché ho fatto una richiesta per dire dove ha fallito. Sono abbastanza sicuro che altrimenti risolverebbe rapidamente anche questa domanda.

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































