<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mahdi SHamlou | مهدی شاملو</title>
    <description>The latest articles on DEV Community by Mahdi SHamlou | مهدی شاملو (@mahdi0shamlou).</description>
    <link>https://dev.to/mahdi0shamlou</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3697084%2Fa7962611-bef0-4ef6-b527-49cb9cdff5aa.jpeg</url>
      <title>DEV Community: Mahdi SHamlou | مهدی شاملو</title>
      <link>https://dev.to/mahdi0shamlou</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mahdi0shamlou"/>
    <language>en</language>
    <item>
      <title>How to Benchmark Web Frameworks in a Fair, Isolated Way | Mahdi Shamlou</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Sat, 21 Feb 2026 20:39:44 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/how-to-benchmark-web-frameworks-in-a-fair-isolated-way-mahdi-shamlou-1mol</link>
      <guid>https://dev.to/mahdi0shamlou/how-to-benchmark-web-frameworks-in-a-fair-isolated-way-mahdi-shamlou-1mol</guid>
      <description>&lt;p&gt;Hey everyone! Mahdi Shamlou here 👋  &lt;/p&gt;

&lt;p&gt;I’ve seen many posts online comparing web frameworks, but most of them are either &lt;strong&gt;biased, outdated, or hard to reproduce&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;So I wanted to share a &lt;strong&gt;practical way to benchmark any web framework&lt;/strong&gt;, keeping everything &lt;strong&gt;isolated, fair, and reproducible&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7csp2k2kv7c6oszg67m5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7csp2k2kv7c6oszg67m5.png" alt="Mahdi Shamlou" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’ll use &lt;strong&gt;Docker&lt;/strong&gt; for isolation, &lt;strong&gt;k6&lt;/strong&gt; for load testing, and &lt;strong&gt;Python frameworks&lt;/strong&gt; — FastAPI and Flask — as simple examples. But the approach works for &lt;strong&gt;Node.js, Go, Java, Rust, or anything else&lt;/strong&gt;.  &lt;/p&gt;




&lt;h2&gt;
  
  
  Why Isolated Benchmarking Matters
&lt;/h2&gt;

&lt;p&gt;Benchmarking web frameworks can be tricky. Many factors affect results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU &amp;amp; memory availability
&lt;/li&gt;
&lt;li&gt;Number of workers / threads
&lt;/li&gt;
&lt;li&gt;Background processes
&lt;/li&gt;
&lt;li&gt;Routing, logging, database, I/O
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To make a fair comparison, you need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Docker containers&lt;/strong&gt; with fixed CPU &amp;amp; memory
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identical routes&lt;/strong&gt; or endpoints in each framework
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controlled load tests&lt;/strong&gt; using k6 or similar tools
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Results saved&lt;/strong&gt; for later analysis
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 1 — Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;web_framework_benchmarks
&lt;span class="nb"&gt;cd &lt;/span&gt;web_framework_benchmarks
&lt;span class="nb"&gt;mkdir &lt;/span&gt;framework1 framework2 k6-tests results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can replace framework1 and framework2 with any frameworks you want to compare.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Sample API Route
&lt;/h2&gt;

&lt;p&gt;For demonstration, we use a simple /hello endpoint.&lt;/p&gt;

&lt;p&gt;Python Example (FastAPI):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello world&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python Example (Flask):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jsonify&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;jsonify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello world&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can do the same in Node.js, Go, or Java, just keep the endpoint functionally identical.&lt;/p&gt;

&lt;p&gt;Optional: add a sleep route to simulate I/O/concurrent load.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gs8v8o44ne05mdos4uq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gs8v8o44ne05mdos4uq.png" alt="Mahdi Shamlou" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Dockerize Your Frameworks
&lt;/h2&gt;

&lt;p&gt;Here’s a funny story:&lt;/p&gt;

&lt;p&gt;At first, I ran FastAPI with just uvicorn… and I thought “Yeah, this will do.” But then I realized 🤦‍♂️&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If I run Flask with Gunicorn and FastAPI with Uvicorn alone, it’s like comparing a Ferrari to a bicycle… not fair! just fun!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I fixed it: FastAPI + Gunicorn + UvicornWorker and 1 worker, exactly like Flask.&lt;/p&gt;

&lt;p&gt;FastAPI Dockerfile (Fair Version):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;fastapi uvicorn gunicorn
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["gunicorn", "-k", "uvicorn.workers.UvicornWorker", "-w", "1", "-b", "0.0.0.0:8000", "app:app"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flask Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;flask gunicorn
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["gunicorn", "-w", "1", "-b", "0.0.0.0:8000", "app:app"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;✅ Now both containers have the same worker count, same CPU/memory limits — fair and square!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 4 — k6 Load Testing
&lt;/h2&gt;

&lt;p&gt;k6 scripts for each framework:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;k6/http&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sleep&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;k6&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;stages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;30s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;   &lt;span class="c1"&gt;// ramp-up&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1m&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;   &lt;span class="c1"&gt;// hold load&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;30s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;    &lt;span class="c1"&gt;// ramp-down&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;thresholds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http_req_duration&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p(95)&amp;lt;200&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// 95% of requests should be &amp;lt;200ms&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:8001/hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run and save results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; results
k6 run &lt;span class="nt"&gt;--out&lt;/span&gt; &lt;span class="nv"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;results/framework1.json k6-tests/framework1.js
k6 run &lt;span class="nt"&gt;--out&lt;/span&gt; &lt;span class="nv"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;results/framework2.json k6-tests/framework2.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Works for any language/framework, not just Python.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 5 — Analyze Metrics
&lt;/h2&gt;

&lt;p&gt;With Python + matplotlib (or any plotting tool):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Average latency&lt;/li&gt;
&lt;li&gt;P95 latency&lt;/li&gt;
&lt;li&gt;Requests/sec&lt;/li&gt;
&lt;li&gt;Failure rate
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matplotlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;

&lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Framework1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results/framework1.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Framework2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results/framework2.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;durations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fails&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Point&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metric&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http_req_duration&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;durations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;metric&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http_req_failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fails&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;durations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;durations&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;p95&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;percentile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;durations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;requests&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;durations&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fail_rate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fails&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;avg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Average Response Time (ms)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Key Lessons
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docker isolation → makes everything reproducible&lt;/li&gt;
&lt;li&gt;Worker count &amp;amp; CPU limits → must match&lt;/li&gt;
&lt;li&gt;Simple routes may make Flask look faster, don’t be fooled&lt;/li&gt;
&lt;li&gt;Async/I/O-heavy routes → FastAPI (or other async frameworks) shine&lt;/li&gt;
&lt;li&gt;Always benchmark your actual workload, not just tiny examples&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔹TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pick frameworks → Dockerize with identical resources&lt;/li&gt;
&lt;li&gt;Create identical endpoints → optionally simulate I/O&lt;/li&gt;
&lt;li&gt;Load test with k6 → save JSON results&lt;/li&gt;
&lt;li&gt;Plot metrics → avg latency, P95, requests, fail rate&lt;/li&gt;
&lt;li&gt;Compare fairly → draw conclusions based on your workload&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📂 Try It Yourself
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You can check out my repo: &lt;a href="https://github.com/mahdi0shamlou/web_framework_benchmarks" rel="noopener noreferrer"&gt;web_framework_benchmarks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Clone it, run the Docker + k6 setup yourself&lt;/li&gt;
&lt;li&gt;Explore FastAPI &amp;amp; Flask examples&lt;/li&gt;
&lt;li&gt;Or even contribute and add more frameworks for comparison&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Want More?
&lt;/h2&gt;

&lt;p&gt;If you enjoyed this deep dive, you might like my other article:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kqemjn09mkamupsgh4v.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kqemjn09mkamupsgh4v.jpeg" alt="Mahdi Shamlou" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/mahdi0shamlou/mahdi-shamlou-durable-workflow-engines-comparison-temporal-dbos-transact-prefect-custom-3a6a"&gt;How I Won an Algorithm Competition at University — With a Smart Trick | Mahdi Shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In that post, I share a clever approach that helped me solve tricky algorithm problems efficiently — a real-life example of strategy + code. 🚀&lt;/p&gt;

&lt;p&gt;🔗 LinkedIn:&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/mahdi-shamlou-3b52b8278" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mahdi-shamlou-3b52b8278&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📱 Telegram:&lt;br&gt;
&lt;a href="https://telegram.me/mahdi0shamlou" rel="noopener noreferrer"&gt;https://telegram.me/mahdi0shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 Instagram:&lt;br&gt;
&lt;a href="https://www.instagram.com/mahdi0shamlou/" rel="noopener noreferrer"&gt;https://www.instagram.com/mahdi0shamlou/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Author: Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>benchmark</category>
    </item>
    <item>
      <title>Go Web Frameworks Comparison 2026 — Top 5 Picks: Gin, Fiber, Echo, Chi &amp; Beego | Mahdi Shamlou</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Fri, 20 Feb 2026 08:19:49 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/go-web-frameworks-comparison-2026-top-5-picks-gin-fiber-echo-chi-beego-mahdi-shamlo-57d4</link>
      <guid>https://dev.to/mahdi0shamlou/go-web-frameworks-comparison-2026-top-5-picks-gin-fiber-echo-chi-beego-mahdi-shamlo-57d4</guid>
      <description>&lt;p&gt;Hey everyone! Mahdi Shamlou here again 👋&lt;/p&gt;

&lt;p&gt;After my article on &lt;a href="https://dev.to/mahdi0shamlou/mahdi-shamlou-durable-workflow-engines-comparison-temporal-dbos-transact-prefect-custom-3a6a"&gt;durable workflow engines in Python&lt;/a&gt;, I wanted to explore something new: &lt;strong&gt;modern Go web frameworks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I searched online and honestly… most articles were old, incomplete, or clearly biased to one framework&lt;/p&gt;

&lt;p&gt;So I decided to write a fresh, practical comparison for 2026 with real benchmark sources and real developer experience.&lt;/p&gt;

&lt;p&gt;Let’s go 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Go for Web Development?
&lt;/h2&gt;

&lt;p&gt;Go became super popular for backend APIs because it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Very high performance (compiled language)&lt;/li&gt;
&lt;li&gt;Easy concurrency with goroutines &lt;/li&gt;
&lt;li&gt;Simple deployment (single binary) &lt;/li&gt;
&lt;li&gt;Great for microservices and cloud apps&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Big companies like Google, Uber, Twitch, Dropbox use Go heavily for backend services.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Top 5 Go Web Frameworks in 2026
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Gin — The Safe Default Choice
&lt;/h2&gt;

&lt;p&gt;Website → &lt;a href="https://gin-gonic.com/" rel="noopener noreferrer"&gt;https://gin-gonic.com/&lt;/a&gt;&lt;br&gt;
GitHub → &lt;a href="https://github.com/gin-gonic/gin" rel="noopener noreferrer"&gt;https://github.com/gin-gonic/gin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gin is probably the most used Go framework today. If you don’t know what to pick, pick Gin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning speed:&lt;/strong&gt; 1–2 days&lt;br&gt;
&lt;strong&gt;Benchmark idea:&lt;/strong&gt; ~50k–70k req/sec&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths 👍&lt;/strong&gt;&lt;br&gt;
• Very easy to start&lt;br&gt;
• Huge community and middleware&lt;br&gt;
• Stable and production‑proven&lt;br&gt;
• Works with standard net/http ecosystem&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs 👎&lt;/strong&gt;&lt;br&gt;
• Not opinionated → big projects can become messy&lt;br&gt;
• No built‑in dependency injection&lt;br&gt;
• Some people dislike its context style&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Fiber — Express.js Style for Go
&lt;/h2&gt;

&lt;p&gt;Website → &lt;a href="https://gofiber.io/" rel="noopener noreferrer"&gt;https://gofiber.io/&lt;/a&gt;&lt;br&gt;
GitHub → &lt;a href="https://github.com/gofiber/fiber" rel="noopener noreferrer"&gt;https://github.com/gofiber/fiber&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fiber feels like Express.js but written in Go. If you come from Node.js, you’ll love it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning speed:&lt;/strong&gt; 1 day&lt;br&gt;
&lt;strong&gt;Benchmark idea:&lt;/strong&gt; ~70k–110k req/sec&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths 👍&lt;/strong&gt;&lt;br&gt;
• Extremely fast&lt;br&gt;
• Very familiar for Node developers&lt;br&gt;
• Many built‑in features&lt;br&gt;
• Clean and simple syntax&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs 👎&lt;/strong&gt;&lt;br&gt;
• Uses fasthttp instead of net/http&lt;br&gt;
• Some Go libraries don’t work&lt;br&gt;
• Debugging can be harder&lt;br&gt;
• Smaller ecosystem than Gin&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Echo — Clean and Mature Framework
&lt;/h2&gt;

&lt;p&gt;Website → &lt;a href="https://echo.labstack.com/" rel="noopener noreferrer"&gt;https://echo.labstack.com/&lt;/a&gt;&lt;br&gt;
GitHub → &lt;a href="https://github.com/labstack/echo" rel="noopener noreferrer"&gt;https://github.com/labstack/echo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Echo is like the balanced framework. Not too small, not too big.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning speed:&lt;/strong&gt; 2–3 days&lt;br&gt;
&lt;strong&gt;Benchmark idea:&lt;/strong&gt; ~50k–65k req/sec&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths 👍&lt;/strong&gt;&lt;br&gt;
• Clean structure&lt;br&gt;
• Built‑in validation and middleware&lt;br&gt;
• Good documentation&lt;br&gt;
• Mature and stable&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs 👎&lt;/strong&gt;&lt;br&gt;
• Smaller ecosystem than Gin&lt;br&gt;
• Some advanced features need extra libraries&lt;br&gt;
• Not as fast as Fiber&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Chi — Lightweight Router for Clean Architecture
&lt;/h2&gt;

&lt;p&gt;Website → &lt;a href="https://go-chi.io/" rel="noopener noreferrer"&gt;https://go-chi.io/&lt;/a&gt;&lt;br&gt;
GitHub → &lt;a href="https://github.com/go-chi/chi" rel="noopener noreferrer"&gt;https://github.com/go-chi/chi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chi is not a full framework. It’s a router used in many serious microservices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning speed:&lt;/strong&gt; Few hours&lt;br&gt;
&lt;strong&gt;Benchmark idea:&lt;/strong&gt; ~45k–60k req/sec&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths 👍&lt;/strong&gt;&lt;br&gt;
• Very lightweight&lt;br&gt;
• Uses standard net/http&lt;br&gt;
• Perfect for clean architecture&lt;br&gt;
• Easy testing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs 👎&lt;/strong&gt;&lt;br&gt;
• Not beginner friendly&lt;br&gt;
• You must build everything yourself&lt;br&gt;
• No built‑in ORM or helpers&lt;br&gt;
• Slower to start small projects&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Beego — Full MVC Framework
&lt;/h2&gt;

&lt;p&gt;Website → &lt;a href="https://beego.vip/" rel="noopener noreferrer"&gt;https://beego.vip/&lt;/a&gt;&lt;br&gt;
GitHub → &lt;a href="https://github.com/beego/beego" rel="noopener noreferrer"&gt;https://github.com/beego/beego&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beego is like Django. It has ORM, CLI, sessions, templates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning speed:&lt;/strong&gt; 1–2 weeks&lt;br&gt;
&lt;strong&gt;Benchmark idea:&lt;/strong&gt; ~20k–40k req/sec&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths 👍&lt;/strong&gt;&lt;br&gt;
• Everything built‑in&lt;br&gt;
• Fast development for monolith apps&lt;br&gt;
• Good CLI tools&lt;br&gt;
• Built‑in ORM and templates&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs 👎&lt;/strong&gt;&lt;br&gt;
• Slower performance&lt;br&gt;
• Heavy compared to Gin or Fiber&lt;br&gt;
• Smaller community today&lt;br&gt;
• Not ideal for microservices&lt;/p&gt;




&lt;h2&gt;
  
  
  Where These Benchmark Numbers Come From
&lt;/h2&gt;

&lt;p&gt;The numbers above are not random. You can verify them here:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://www.techempower.com/benchmarks/" rel="noopener noreferrer"&gt;https://www.techempower.com/benchmarks/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the most trusted benchmark in backend engineering. It runs frameworks on the same hardware and same workload.&lt;/p&gt;

&lt;p&gt;But remember ⚠️&lt;br&gt;
Real performance depends on:&lt;br&gt;
• database usage&lt;br&gt;
• logging&lt;br&gt;
• authentication&lt;br&gt;
• payload size&lt;br&gt;
• TLS&lt;br&gt;
• hardware&lt;/p&gt;

&lt;p&gt;So always run your own benchmark. &lt;/p&gt;




&lt;h2&gt;
  
  
  My Recommendation for 2026
&lt;/h2&gt;

&lt;p&gt;If you are new → Start with Gin.&lt;br&gt;
If you need max performance → Try Fiber.&lt;br&gt;
If you want balanced structure → Use Echo.&lt;br&gt;
If you love clean architecture → Use Chi.&lt;br&gt;
If you want full MVC → Use Beego.&lt;/p&gt;

&lt;p&gt;There is no perfect framework. Pick the one that fits your team and project.&lt;/p&gt;




&lt;h2&gt;
  
  
  Want More?
&lt;/h2&gt;

&lt;p&gt;If you enjoyed this deep dive, you might like my other article:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kqemjn09mkamupsgh4v.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kqemjn09mkamupsgh4v.jpeg" alt="Mahdi Shamlou" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/mahdi0shamlou/mahdi-shamlou-durable-workflow-engines-comparison-temporal-dbos-transact-prefect-custom-3a6a"&gt;How I Won an Algorithm Competition at University — With a Smart Trick | Mahdi Shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In that post, I share a clever approach that helped me solve tricky algorithm problems efficiently — a real-life example of strategy + code. 🚀&lt;/p&gt;

&lt;p&gt;🔗 LinkedIn:&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/mahdi-shamlou-3b52b8278" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mahdi-shamlou-3b52b8278&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📱 Telegram:&lt;br&gt;
&lt;a href="https://telegram.me/mahdi0shamlou" rel="noopener noreferrer"&gt;https://telegram.me/mahdi0shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 Instagram:&lt;br&gt;
&lt;a href="https://www.instagram.com/mahdi0shamlou/" rel="noopener noreferrer"&gt;https://www.instagram.com/mahdi0shamlou/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Author: Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Mahdi Shamlou | Durable Workflow Engines Comparison — Temporal, DBOS Transact, Prefect &amp; Custom Python Engines Mahdi SHamlou</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Thu, 19 Feb 2026 14:31:10 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/mahdi-shamlou-durable-workflow-engines-comparison-temporal-dbos-transact-prefect-custom-3a6a</link>
      <guid>https://dev.to/mahdi0shamlou/mahdi-shamlou-durable-workflow-engines-comparison-temporal-dbos-transact-prefect-custom-3a6a</guid>
      <description>&lt;p&gt;Hey everyone! &lt;strong&gt;Mahdi Shamlou&lt;/strong&gt; here again 🚀&lt;/p&gt;

&lt;p&gt;After diving into classic algorithm challenges like LeetCode #8 String to Integer (atoi), today I want to explore something a bit different — durable workflow engines in Python.&lt;/p&gt;

&lt;p&gt;I noticed most blog posts out there are old, incomplete, or heavily biased toward one tool. So I decided to create a fresh, practical comparison and give my take on which workflow engine you should pick in 2026.&lt;/p&gt;

&lt;p&gt;Let’s dive in.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is a Durable Workflow Engine?
&lt;/h2&gt;

&lt;p&gt;A durable workflow engine helps you run code reliably and safely, even if your app crashes, your machine restarts, or network hiccups occur. They’re particularly useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Long-running processes (hours, days, or even months)&lt;/li&gt;
&lt;li&gt;    Background jobs and automation&lt;/li&gt;
&lt;li&gt;    Retry, compensation, and saga patterns&lt;/li&gt;
&lt;li&gt;    Observability &amp;amp; external signaling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I’ll compare four approaches:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;   Temporal — the battle-tested distributed platform&lt;/li&gt;
&lt;li&gt;    DBOS Transact — lightweight embedded durability in Postgres&lt;/li&gt;
&lt;li&gt;    Prefect 3.x — Pythonic, open-source workflow orchestration&lt;/li&gt;
&lt;li&gt;    Custom Python engine — pure Python + your own persistence&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Temporal (temporalio/sdk-python)
&lt;/h2&gt;

&lt;p&gt;Temporal is a production-proven, distributed workflow engine originally built at Uber (as Cadence). It’s used by DoorDash, Snap, Stripe, and others.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ferj8i8vl52zu80xhm91x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ferj8i8vl52zu80xhm91x.jpg" alt="Mahdi Shamlou" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Workflows as code (functions/classes)&lt;/li&gt;
&lt;li&gt;    Activities separated from orchestration&lt;/li&gt;
&lt;li&gt;    External Temporal server handles task durability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Maximum durability — even months-long workflows survive anything&lt;/li&gt;
&lt;li&gt;    Signals, queries, workflow versioning, child workflows&lt;/li&gt;
&lt;li&gt;    Multi-language support (Python, Go, Java, TS, .NET)&lt;/li&gt;
&lt;li&gt;    Great observability (Temporal Web UI / Cloud)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Requires server/cluster → more ops complexity&lt;/li&gt;
&lt;li&gt;    Higher learning curve and more code&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. DBOS Transact (dbos-transact-py)
&lt;/h2&gt;

&lt;p&gt;DBOS Transact is an embedded durable engine for Python backed by Postgres. Think of it as “durable Python without leaving your app.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9zdgxy0bg1hu6j5ae6av.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9zdgxy0bg1hu6j5ae6av.jpg" alt="Mahdi Shamlou" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Annotate normal Python functions with @workflow and &lt;a class="mentioned-user" href="https://dev.to/step"&gt;@step&lt;/a&gt; decorators&lt;/li&gt;
&lt;li&gt;    Each step automatically checkpoints its state in Postgres&lt;/li&gt;
&lt;li&gt;    On crash/restart, workflow resumes from last checkpoint&lt;/li&gt;
&lt;li&gt;    External events or signals can be sent with recv() / send() methods&lt;/li&gt;
&lt;li&gt;    Minimal changes to your existing code — the library handles durability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Minimal code changes → easy to adopt&lt;/li&gt;
&lt;li&gt;    Lightweight, fast, low ops overhead&lt;/li&gt;
&lt;li&gt;    Great performance for embedded durability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Tied to Postgres&lt;/li&gt;
&lt;li&gt;    Fewer advanced features than Temporal&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Prefect (Prefect 3.x)
&lt;/h2&gt;

&lt;p&gt;Prefect is a Python-first workflow orchestration framework — great for data pipelines, ML workflows, and automation tasks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37mgljq8qe5pxx7wzffa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37mgljq8qe5pxx7wzffa.png" alt="Mahdi Shamlou" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Define workflows with &lt;a class="mentioned-user" href="https://dev.to/flow"&gt;@flow&lt;/a&gt; and tasks with @task decorators&lt;/li&gt;
&lt;li&gt;    Each task execution is automatically tracked and persisted (checkpointing)&lt;/li&gt;
&lt;li&gt;    Flows can be suspended/resumed manually or via events&lt;/li&gt;
&lt;li&gt;    Result persistence allows retries, caching, and skipping already-completed tasks&lt;/li&gt;
&lt;li&gt;    Optional Prefect server/agent UI provides real-time observability and control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Extremely Pythonic → minimal code friction&lt;/li&gt;
&lt;li&gt;    Excellent UI and monitoring&lt;/li&gt;
&lt;li&gt;    Durable execution for long-running flows&lt;/li&gt;
&lt;li&gt;    Open-source, hybrid execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Durability is checkpoint-based → not full deterministic replay like Temporal&lt;/li&gt;
&lt;li&gt;    Python-only (no multi-language support)&lt;/li&gt;
&lt;li&gt;    Some advanced saga patterns require manual handling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Pure Python Custom Engine
&lt;/h2&gt;

&lt;p&gt;You could roll your own workflow engine using just Python + a DB or file store.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37xskctrf6m04mf067t9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37xskctrf6m04mf067t9.jpg" alt="Mahdi Shamlou" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Store workflow instances in a table with workflow ID, current step, status, and data&lt;/li&gt;
&lt;li&gt;    Poll a queue (e.g., Redis, RQ, Celery) and execute steps based on stored state&lt;/li&gt;
&lt;li&gt;    Implement retry, timeout, and compensation manually&lt;/li&gt;
&lt;li&gt;    Signals/events handled with a custom event table or pub/sub system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Full control, zero dependencies&lt;/li&gt;
&lt;li&gt;    Simple for very small workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Very easy to get wrong — lost state, duplicates, race conditions&lt;/li&gt;
&lt;li&gt;    No UI or observability out-of-the-box&lt;/li&gt;
&lt;li&gt;    Maintenance grows with complexity&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  My Take: Which One Should You Use?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Start with Prefect or DBOS Transact :&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;    Prefect: Best for Python workflows, great UI, caching, event-driven automations. Durable execution with minimal overhead.&lt;/li&gt;
&lt;li&gt;    DBOS Transact: Ultra-lightweight, embedded durability in Postgres. Great if you want minimal footprint and existing Postgres usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Switch to Temporal when you outgrow the lighter options&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;    Need full deterministic replay, months-long workflows, multi-language, or enterprise-scale reliability.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Custom Python engines are mostly for learning, experiments, or extremely simple workflows.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Want More?
&lt;/h2&gt;

&lt;p&gt;If you enjoyed this deep dive into workflow engines, you might like my other article:&lt;br&gt;
Subscribe to the Medium newsletter&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/mahdi0shamlou/how-i-won-an-algorithm-competition-at-university-with-a-smart-trick-mahdi-shamlou-2odk"&gt;How I Won an Algorithm Competition at University — With a Smart Trick | Mahdi Shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4553ses7eyufzw0ibpk3.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4553ses7eyufzw0ibpk3.jpeg" alt="Mahdi Shamlou" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In that post, I share a clever approach that helped me solve tricky algorithm problems efficiently — a real-life example of strategy + code. 🚀&lt;/p&gt;

&lt;p&gt;🔗 LinkedIn:&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/mahdi-shamlou-3b52b8278" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mahdi-shamlou-3b52b8278&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📱 Telegram:&lt;br&gt;
&lt;a href="https://telegram.me/mahdi0shamlou" rel="noopener noreferrer"&gt;https://telegram.me/mahdi0shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 Instagram:&lt;br&gt;
&lt;a href="https://www.instagram.com/mahdi0shamlou/" rel="noopener noreferrer"&gt;https://www.instagram.com/mahdi0shamlou/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Author: Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>programming</category>
      <category>designsystem</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>How I Won an Algorithm Competition at University — With a Smart Trick | Mahdi Shamlou</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Thu, 19 Feb 2026 12:21:57 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/how-i-won-an-algorithm-competition-at-university-with-a-smart-trick-mahdi-shamlou-2odk</link>
      <guid>https://dev.to/mahdi0shamlou/how-i-won-an-algorithm-competition-at-university-with-a-smart-trick-mahdi-shamlou-2odk</guid>
      <description>&lt;p&gt;Hi everyone,&lt;br&gt;
Mahdi Shamlou here 🚀&lt;/p&gt;

&lt;p&gt;Today I want to share something different from my LeetCode posts.&lt;/p&gt;

&lt;p&gt;Recently, I participated in an algorithm &amp;amp; programming competition at Islamic Azad University — and I won! 🎉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmt41hbuxiheoj0wez0g.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmt41hbuxiheoj0wez0g.jpeg" alt="Mahdi Shamlou" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The contest had 4 problems, and I want to start with the first one because it taught me an important lesson about thinking before coding.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧩 Problem 1 — Two Cubes Puzzle
&lt;/h2&gt;

&lt;p&gt;We had to design &lt;strong&gt;two cubes with digits on their faces&lt;/strong&gt; so that we could display every number from &lt;strong&gt;0 to n&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5nyte7budh38y8ubexjn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5nyte7budh38y8ubexjn.png" alt="Mahdi Shamlou" width="800" height="672"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each cube has 6 faces (6 digits).&lt;/li&gt;
&lt;li&gt;By placing the cubes side-by-side, we must form all numbers from &lt;strong&gt;0 → n&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If possible → output cube configuration&lt;/li&gt;
&lt;li&gt;If impossible → return &lt;code&gt;"Impossible"&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Important detail:&lt;/p&gt;

&lt;p&gt;We &lt;strong&gt;cannot rotate 6 to become 9&lt;/strong&gt;.&lt;br&gt;
So if we need digit 9, it must exist explicitly on a cube.&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 My Strategy
&lt;/h2&gt;

&lt;p&gt;At first glance, this looks like a brute-force search problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate combinations&lt;/li&gt;
&lt;li&gt;Test permutations&lt;/li&gt;
&lt;li&gt;Check all numbers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I realized something:&lt;/p&gt;

&lt;p&gt;👉 The number of valid configurations is extremely limited.&lt;/p&gt;

&lt;p&gt;So instead of writing a complex generator, I solved the cube puzzle &lt;strong&gt;manually on paper first&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After finding the correct configuration, I simply returned that fixed solution in code.&lt;/p&gt;

&lt;p&gt;No brute force.&lt;br&gt;
No heavy computation.&lt;br&gt;
Just logic.&lt;/p&gt;


&lt;h2&gt;
  
  
  ❗ The Impossible Case
&lt;/h2&gt;

&lt;p&gt;Because we need digit 9 explicitly and cannot reuse 6 as 9:&lt;/p&gt;

&lt;p&gt;👉 If &lt;strong&gt;n &amp;gt; 30&lt;/strong&gt;, the answer is &lt;code&gt;"Impossible"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;30 is the maximum achievable upper bound with valid cube digit placement.&lt;/p&gt;


&lt;h2&gt;
  
  
  🐍 Python Implementation
&lt;/h2&gt;

&lt;p&gt;Here is the corrected Python version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;two_cubes_solution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Impossible case
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Impossible&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Pre-calculated cube faces (solved manually)
&lt;/span&gt;    &lt;span class="n"&gt;cube1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;cube2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cube1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cube2&lt;/span&gt;


&lt;span class="c1"&gt;# Example usage
&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;two_cubes_solution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Why This Approach Won
&lt;/h2&gt;

&lt;p&gt;✔ O(1) time&lt;br&gt;
✔ O(1) space&lt;br&gt;
✔ Zero computation overhead&lt;br&gt;
✔ Guaranteed correctness&lt;/p&gt;

&lt;p&gt;The key lesson:&lt;/p&gt;

&lt;p&gt;Sometimes the smartest algorithm is solving the logic once and letting the code stay simple.&lt;/p&gt;




&lt;p&gt;I’ll share the next competition problem soon — that one was much more algorithm-heavy 😄&lt;/p&gt;

&lt;p&gt;Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>computerscience</category>
      <category>devjournal</category>
      <category>programming</category>
    </item>
    <item>
      <title>Mahdi Shamlou | Solving LeetCode #8: String to Integer (atoi) — Step by Step</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Sat, 31 Jan 2026 12:02:11 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-8-string-to-integer-atoi-step-by-step-426a</link>
      <guid>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-8-string-to-integer-atoi-step-by-step-426a</guid>
      <description>&lt;p&gt;Hey everyone! &lt;strong&gt;Mahdi Shamlou&lt;/strong&gt; here — continuing my LeetCode classic problems series 🚀&lt;/p&gt;

&lt;p&gt;After [&lt;a href="https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-7-reverse-integer-my-math-based-reversal-with-overflow-safety-p95"&gt;#7 Reverse Integer&lt;/a&gt; (&lt;a href="https://dev.to/mahdi0shamlou"&gt;See the list that I solved&lt;/a&gt;)], today I jumped into Problem #8 — String to Integer (atoi).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuggjoy8cmfpslsufak9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuggjoy8cmfpslsufak9g.png" alt="Mahdi Shamlou | مهدی شاملو" width="300" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first glance, this one looks easy… but once you start reading the rules carefully, you realize it’s all about edge cases 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Statement:
&lt;/h2&gt;

&lt;p&gt;Implement the myAtoi(string s) function, which converts a string to a 32-bit signed integer.&lt;/p&gt;

&lt;p&gt;The algorithm should:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;    Ignore leading whitespace&lt;/li&gt;
&lt;li&gt;    Check for an optional + or - sign&lt;/li&gt;
&lt;li&gt;    Read digits until a non-digit is found&lt;/li&gt;
&lt;li&gt;    Clamp the result to the 32-bit signed integer range: [-²³¹, ²³¹ − 1]&lt;/li&gt;
&lt;li&gt;    Return 0 if no valid conversion exists&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input: "42"
Output: 42
----
Input: "   -42"
Output: -42
----
Input: "4193 with words"
Output: 4193
----
Input: "words and 987"
Output: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My Thought Process&lt;/p&gt;

&lt;p&gt;When I started, I told myself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Okay… don’t panic. Just follow the rules one by one. just do it !&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I broke the problem into simple steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;    Skip all leading whitespaces&lt;/li&gt;
&lt;li&gt;    Detect the sign (+ or -)&lt;/li&gt;
&lt;li&gt;    Read digits and build the number&lt;/li&gt;
&lt;li&gt;    Handle overflow before it happens&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;That last part is super important — Python won’t overflow, but LeetCode expects 32-bit behavior.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Solution (Clean &amp;amp; Safe)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;myAtoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
        first of all i think i can just jump empty section of s

        &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Step 1: Skip whitespaces
&lt;/span&gt;        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

        &lt;span class="c1"&gt;# Step 3: find sign
&lt;/span&gt;        &lt;span class="n"&gt;sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="c1"&gt;# Step 4: read the s for findig ints 
&lt;/span&gt;        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;INT_MAX_OF_OVERFELLOW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;   &lt;span class="c1"&gt;# 2147483647
&lt;/span&gt;        &lt;span class="n"&gt;INT_MIN_OF_OVERFELLOW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;      &lt;span class="c1"&gt;# -2147483648
&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;digit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;


            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;INT_MAX_OF_OVERFELLOW&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;digit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;INT_MAX_OF_OVERFELLOW&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sign&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;INT_MIN_OF_OVERFELLOW&lt;/span&gt;

            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;digit&lt;/span&gt;
            &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;


        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;sign&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;sorry my comments not okay :)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Why I Like This Approach&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    ️ Easy to read&lt;/li&gt;
&lt;li&gt;    ️ Matches the problem rules exactly&lt;/li&gt;
&lt;li&gt;    ️ Handles all edge cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Final Thoughts&lt;/p&gt;

&lt;p&gt;This problem taught me something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sometimes the “hard” part isn’t the algorithm — it’s discipline.
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reading carefully.&lt;br&gt;
Handling edge cases.&lt;br&gt;
Not rushing.&lt;/p&gt;

&lt;p&gt;And yes… after passing all test cases in first time, I had that quick “okay, nice” moment — and then I jumped straight to the next problem 🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zqmwvzdm5zjxn9bpus0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zqmwvzdm5zjxn9bpus0.jpg" alt="Mahdi Shamlou | مهدی شاملو" width="800" height="1062"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Repo (All Solutions)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/mahdi0shamlou/LeetCode" rel="noopener noreferrer"&gt;&lt;br&gt;
GitHub — mahdi0shamlou/LeetCode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What about you?&lt;/p&gt;

&lt;p&gt;How did you approach this problem?&lt;br&gt;
Did you miss any edge case the first time?&lt;/p&gt;

&lt;p&gt;Drop your thoughts — I read everything! 🚀&lt;br&gt;
Connect with me&lt;/p&gt;

&lt;p&gt;🔗 LinkedIn:&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/mahdi-shamlou-3b52b8278" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mahdi-shamlou-3b52b8278&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📱 Telegram:&lt;br&gt;
&lt;a href="https://telegram.me/mahdi0shamlou" rel="noopener noreferrer"&gt;https://telegram.me/mahdi0shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 Instagram:&lt;br&gt;
&lt;a href="https://www.instagram.com/mahdi0shamlou/" rel="noopener noreferrer"&gt;https://www.instagram.com/mahdi0shamlou/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Author: Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>python</category>
      <category>leetcode</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Mahdi Shamlou | Solving LeetCode #7: Reverse Integer — My Math-Based Reversal with Overflow Safety</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Sat, 31 Jan 2026 11:53:08 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-7-reverse-integer-my-math-based-reversal-with-overflow-safety-p95</link>
      <guid>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-7-reverse-integer-my-math-based-reversal-with-overflow-safety-p95</guid>
      <description>&lt;p&gt;Hey everyone! &lt;strong&gt;Mahdi Shamlou&lt;/strong&gt; here — continuing my LeetCode classic problems series 🚀&lt;/p&gt;

&lt;p&gt;After [&lt;a href="https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-5-longest-palindromic-substring-my-expand-around-center-3pgi"&gt;#6 Zigzag Conversion&lt;/a&gt; (&lt;a href="https://dev.to/mahdi0shamlou"&gt;See the list that I solved&lt;/a&gt;)], today we’re tackling Problem #7 — Reverse Integer — a very common easy/medium question that looks simple at first… until you remember the 32-bit integer overflow trap!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybvuiqvj4jrepkqx8bge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybvuiqvj4jrepkqx8bge.png" alt="Mahdi Shamlou | مهدی شاملو" width="300" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Statement :
&lt;/h2&gt;

&lt;p&gt;Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-2³¹,2³¹ — 1], then return 0.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assume the environment does not allow 64-bit integers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input: x = 123
Output: 321

Input: x = -123
Output: -321

Input: x = 120
Output: 21

Input: x = 0
Output: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  My solution:
&lt;/h2&gt;

&lt;p&gt;digit-by-digit reversal with overflow check . I decided to avoid string conversion and do it mathematically — pop digits with % 10, build the reversed number, and most importantly check for overflow before multiplying by 10 and adding the digit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

        &lt;span class="n"&gt;reversed_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;# create reverse_x to return 
&lt;/span&gt;
        &lt;span class="c1"&gt;# Try to Handle the sign separately
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;sign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;digit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
            &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

            &lt;span class="c1"&gt;# checks for overflow before adding the new digit
&lt;/span&gt;            &lt;span class="c1"&gt;# 2**31 - 1 is equals = 2147483647
&lt;/span&gt;            &lt;span class="c1"&gt;# -2**31    is equals = -2147483648
&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;reversed_x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2147483647&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;digit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# but you can use dynamic number calculation like 2**31-1
&lt;/span&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;reversed_x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2147483648&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;digit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

            &lt;span class="n"&gt;reversed_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reversed_x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;digit&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sign&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;reversed_x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;It passes all cases — and feels clean because we catch overflow before it actually happens.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/mahdi0shamlou/LeetCode" rel="noopener noreferrer"&gt;My repo (all solutions are here): GitHub — mahdi0shamlou/LeetCode: Solve LeetCode Problems&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Time &amp;amp; Space&lt;br&gt;
    Time: O(log |x|) — we process each digit once&lt;br&gt;
    Space: O(1) — just a few variables&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What about you? Did you also do it mathematically like me? How did you handle the overflow part — did you use constants or 2**31?&lt;/p&gt;

&lt;p&gt;Share in the comments — I read everything! 🚀&lt;/p&gt;

&lt;p&gt;And honestly… after seeing those overflow cases return 0 correctly and the normal ones reverse perfectly, I just smiled and thought “yes — safe and elegant!” 😂 Here’s me right after submitting:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnzj4i5bll0nwkzhl5dq4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnzj4i5bll0nwkzhl5dq4.jpg" alt="Mahdi Shamlou | مهدی شاملو" width="800" height="1062"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect with me:&lt;/p&gt;

&lt;p&gt;🔗 LinkedIn: &lt;a href="https://www.linkedin.com/in/mahdi-shamlou" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mahdi-shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📱 Telegram: &lt;a href="https://t.me/mahdi_shamlou" rel="noopener noreferrer"&gt;https://t.me/mahdi_shamlou&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
📸 Instagram: &lt;a href="https://www.instagram.com/mahdi.shamlou" rel="noopener noreferrer"&gt;https://www.instagram.com/mahdi.shamlou&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
Author: Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>leetcode</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Mahdi Shamlou | Solving LeetCode #6: Zigzag Conversion — My Row-by-Row Simulation Fun Way</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Sat, 31 Jan 2026 11:43:25 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-6-zigzag-conversion-my-row-by-row-simulation-fun-way-1knm</link>
      <guid>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-6-zigzag-conversion-my-row-by-row-simulation-fun-way-1knm</guid>
      <description>&lt;p&gt;Hey everyone! &lt;strong&gt;Mahdi Shamlou&lt;/strong&gt; here — rolling on with my LeetCode classic problems series 🚀&lt;/p&gt;

&lt;p&gt;After [&lt;a href="https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-5-longest-palindromic-substring-my-expand-around-center-3pgi"&gt;#5 Longest Palindromic Substring&lt;/a&gt; (&lt;a href="https://dev.to/mahdi0shamlou"&gt;See the list that i solved&lt;/a&gt;)], today we’re tackling Problem #6 — Zigzag Conversion (also called ZigZag Conversion) — a cool medium-level problem that feels like drawing a zigzag pattern with letters!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7crj1yo7z9i9swvc8lf8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7crj1yo7z9i9swvc8lf8.png" alt="Mahdi Shamlou | مهدی شاملو" width="300" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;The string s is written in a zigzag pattern on a given number of rows like this (imagine fixed font):&lt;/p&gt;

&lt;p&gt;For s = “PAYPALISHIRING”, numRows = 3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P   A   H   N
A P L S I I G Y
I   R
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read line by line: “PAHNAPLSIIGYIR”&lt;/p&gt;

&lt;p&gt;Write a function to convert the string this way given numRows.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"

Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P     I    N
A   L S  I G Y
A   H R
P     I

Input: s = "AB", numRows = 2
Output: "AB"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  My solution :
&lt;/h2&gt;

&lt;p&gt;The simulation way with direction flip (this felt natural!) I imagined walking down the rows, then up, then down again — like a real zigzag. So I used a list of strings (one per row), a counter for current row, and a direction flag that flips at top/bottom.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numRows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="n"&gt;numRows_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;numRows_counter_way&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# wait, this was a bug — should init outside!
&lt;/span&gt;            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;numRows_counter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;numRows_counter&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;numRows_counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;numRows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;numRows_counter_way&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;numRows_counter&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;numRows_counter_way&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;numRows_counter_way&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;numRows_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numRows_counter&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;numRows_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numRows_counter&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="n"&gt;final_res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;final_res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;final_res&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;final_res&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: In my first run I had result = [] and appended empty string each time — that’s not correct! (It would create too many empty slots.) The proper way is to initialize result = [“”] * numRows outside the loop. But hey, this direction-flip idea still clicked for me after fixing that 😅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My repo (all solutions are here):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mahdi0shamlou/LeetCode" rel="noopener noreferrer"&gt;GitHub — mahdi0shamlou/LeetCode: Solve LeetCode Problems&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What about you? Did you simulate the zigzag with rows like me, or did you go for the math formula way (cycle length = 2*numRows-2)? Any funny bugs you hit on this one?&lt;/p&gt;

&lt;p&gt;Share in the comments — I read everything! 🚀&lt;/p&gt;

&lt;p&gt;And honestly… after seeing “PINALSIGYAHRPI” come out correctly I just sat there grinning like an idiot — that zigzag finally made sense in code! 😂 Here’s me right after it worked:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6vi44zf9xthtr7s968g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn6vi44zf9xthtr7s968g.jpg" alt="Mahdi Shamlou | مهدی شاملو" width="779" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect with me:&lt;/p&gt;

&lt;p&gt;🔗 LinkedIn: &lt;a href="https://www.linkedin.com/in/mahdi-shamlou-3b52b8278" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mahdi-shamlou-3b52b8278&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📱 Telegram: &lt;a href="https://telegram.me/mahdi0shamlou" rel="noopener noreferrer"&gt;https://telegram.me/mahdi0shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 Instagram: &lt;a href="https://www.instagram.com/mahdi0shamlou/" rel="noopener noreferrer"&gt;https://www.instagram.com/mahdi0shamlou/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Author: Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>programming</category>
      <category>leetcode</category>
      <category>algorithms</category>
      <category>python</category>
    </item>
    <item>
      <title>Mahdi Shamlou | Solving LeetCode #5: Longest Palindromic Substring — My Expand-Around-Center Adventure</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Sat, 31 Jan 2026 11:33:16 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-5-longest-palindromic-substring-my-expand-around-center-3pgi</link>
      <guid>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-5-longest-palindromic-substring-my-expand-around-center-3pgi</guid>
      <description>&lt;p&gt;Hey everyone! Mahdi Shamlou here — keeping the LeetCode classic problems series rolling 🚀&lt;/p&gt;

&lt;p&gt;After [&lt;a href="https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-4-median-of-two-sorted-arrays-my-first-attempt-5fcl"&gt;#4 Median of Two Sorted Arrays&lt;/a&gt;], today we’re diving into Problem #5 — Longest Palindromic Substring — another super famous one that shows up in tons of interviews!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3n4hg0bkx9yej3fn48yz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3n4hg0bkx9yej3fn48yz.png" alt="Mahdi Shamlou | مهدی شاملو" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Problem Statement Given a string s, return the longest palindromic substring in s.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A palindrome reads the same forwards and backwards.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input: s = "babad"
Output: "bab"
Explanation: "aba" is also a valid answer (both length 3)

Input: s = "cbbd"
Output: "bb"

Input: s = "a"
Output: "a"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My solution — the expand-around-center way (this clicked for me!) When I first thought about it, checking every possible substring sounded painful (O(n³) nightmare 😅). Then I imagined and then I realized: palindromes can expand from the center!&lt;br&gt;
Become a member&lt;/p&gt;

&lt;p&gt;So I wrote this version — check around each character (for odd-length palindromes) and between each pair (for even-length):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;longestPalindrome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;

        &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;expand_around_center_v2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
                &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
            &lt;span class="c1"&gt;# Case 1: Odd length palindrome (center is single char)
&lt;/span&gt;            &lt;span class="c1"&gt;# Example: "aba" → center at 'b'
&lt;/span&gt;            &lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;expand_around_center_v2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Case 2: Even length palindrome (center between two chars)
&lt;/span&gt;            &lt;span class="c1"&gt;# Example: "bb" → center between the two 'b's
&lt;/span&gt;            &lt;span class="n"&gt;l2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;expand_around_center_v2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;l1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r1&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;l2&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r2&lt;/span&gt;

            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;start : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; and end : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# I kept these to watch it grow 😂
&lt;/span&gt;            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Time Complexity: O(n²)&lt;br&gt;
Space Complexity: O(1) → Perfect!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It feels so elegant — we expand outward as long as characters match, and we do it for every possible center. Time complexity is O(n²) because each expansion can take up to O(n), and we have ~2n centers — but in practice it runs really fast! And also no need to generate all possible substrings (which would be O(n³))&lt;/p&gt;

&lt;p&gt;My repo (all solutions are here):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mahdi0shamlou/LeetCode" rel="noopener noreferrer"&gt;GitHub — mahdi0shamlou/LeetCode: Solve LeetCode Problems&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What about you? Did the expand-around-center idea click for you right away, or did you start with something crazier like checking every substring? 😅 Any favorite test cases that break naive solutions?&lt;/p&gt;

&lt;p&gt;Share in the comments — I read everything! 🚀&lt;/p&gt;

&lt;p&gt;And honestly… after seeing “bb” pop out correctly and watching those print statements show the window growing, I just leaned back, laughed, and thought “yes — this actually works and looks clean!” 😂 Here’s me right after submitting and passing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqa6wtrfhcs0b9hb790n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqa6wtrfhcs0b9hb790n.jpg" alt="Mahdi Shamlou | مهدی شاملو" width="800" height="1062"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect with me:&lt;/p&gt;

&lt;p&gt;🔗 LinkedIn: &lt;a href="https://www.linkedin.com/in/mahdi-shamlou-3b52b8278" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mahdi-shamlou-3b52b8278&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📱 Telegram: &lt;a href="https://telegram.me/mahdi0shamlou" rel="noopener noreferrer"&gt;https://telegram.me/mahdi0shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 Instagram: &lt;a href="https://www.instagram.com/mahdi0shamlou/" rel="noopener noreferrer"&gt;https://www.instagram.com/mahdi0shamlou/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Author: Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>leetcode</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Mahdi Shamlou | Solving LeetCode #4: Median of Two Sorted Arrays — My First Attempt</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Fri, 23 Jan 2026 17:11:09 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-4-median-of-two-sorted-arrays-my-first-attempt-5fcl</link>
      <guid>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-4-median-of-two-sorted-arrays-my-first-attempt-5fcl</guid>
      <description>&lt;p&gt;Hey everyone! Mahdi Shamlou here — continuing my LeetCode classic problems series.&lt;/p&gt;

&lt;p&gt;After &lt;a href="https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-3-longest-substring-without-repeating-characters-my-first-5766"&gt;[Longest Substring Without Repeating Characters]&lt;/a&gt;, today we’re looking at Problem #4 — Median of Two Sorted Arrays — one of the famous hard ones!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzz7tewanurfjowhftn5g.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzz7tewanurfjowhftn5g.webp" alt="Mahdi Shamlou | مهدی شاملو" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input: nums1 = [1,3], nums2 = [2]
Output: 2.00000
Explanation: merged array = [1,2,3] and median is 2.0
-----
Input: nums1 = [1,2], nums2 = [3,4]
Output: 2.50000
Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5
-----
Input: nums1 = [], nums2 = [2,3]
Output: 2.50000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My first intuitive solution (the fun &amp;amp; lazy way I tried) This is exactly what came to my mind when I first saw it — just throw everything together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;findMedianSortedArrays&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nums1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nums2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;list3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nums1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nums2&lt;/span&gt;           &lt;span class="c1"&gt;# just combine them
&lt;/span&gt;        &lt;span class="n"&gt;list3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="c1"&gt;# sort everything
&lt;/span&gt;        &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                    &lt;span class="c1"&gt;# I even printed to see what happens 😂
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mid is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;         &lt;span class="c1"&gt;# even number of elements
&lt;/span&gt;            &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;list3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;                           &lt;span class="c1"&gt;# odd
&lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works, it’s super readable, and honestly — for small inputs — it feels very satisfying to write 😄&lt;/p&gt;

&lt;p&gt;My repo (all solutions are here): &lt;a href="https://github.com/mahdi0shamlou/LeetCode" rel="noopener noreferrer"&gt;GitHub — mahdi0shamlou/LeetCode: Solve LeetCode Problems &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What about you? How did you first approach this problem? Did you also just merge + sort at the beginning like me? 😅 Or did you go straight to something else?&lt;/p&gt;

&lt;p&gt;And honestly… after finally getting this naive version to pass all test cases, I just sat back, laughed at how simple (yet not-so-efficient) it was, and felt that sweet mix of relief and “I did it!” energy 😂 Here’s me right after hitting “Submit”:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdn11lcv6dmqpq0ixobv.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdn11lcv6dmqpq0ixobv.jpeg" alt="Mahdi Shamlou | مهدی شاملو" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Share in the comments — I read everything! 🚀&lt;/p&gt;

&lt;p&gt;Connect with me:&lt;/p&gt;

&lt;p&gt;🔗 LinkedIn: &lt;a href="https://www.linkedin.com/in/mahdi-shamlou-3b52b8278" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mahdi-shamlou-3b52b8278&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📱 Telegram: &lt;a href="https://telegram.me/mahdi0shamlou" rel="noopener noreferrer"&gt;https://telegram.me/mahdi0shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 Instagram: &lt;a href="https://www.instagram.com/mahdi0shamlou/" rel="noopener noreferrer"&gt;https://www.instagram.com/mahdi0shamlou/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Author: Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>interview</category>
      <category>leetcode</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Mahdi Shamlou | Solving LeetCode #3: Longest Substring Without Repeating Characters — My First Attempt &amp; My Optimal Way</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Fri, 23 Jan 2026 17:01:36 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-3-longest-substring-without-repeating-characters-my-first-5766</link>
      <guid>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-3-longest-substring-without-repeating-characters-my-first-5766</guid>
      <description>&lt;p&gt;Hey everyone! Mahdi Shamlou here — continuing my LeetCode classic problems series.&lt;/p&gt;

&lt;p&gt;After &lt;a href="https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-2-add-two-numbers-the-classic-linked-list-addition-5g7c"&gt;[Add Two Numbers]&lt;/a&gt;, today we’re solving Problem #3 — Longest Substring Without Repeating Characters — another very famous interview question!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcyjh91u0jy6irit2nfm.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flcyjh91u0jy6irit2nfm.webp" alt="Mahdi Shamlou | مهدی شاملو" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem Statement
&lt;/h2&gt;

&lt;p&gt;Given a string s, find the length of the longest substring without repeating characters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input: s = "abcabcbb"
Output: 3
Explanation: "abc" is the longest substring without repeating characters.

Input: s = "bbbbb"
Output: 1

Input: s = "pwwkew"
Output: 3
Explanation: "wke" (length 3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My first intuitive solution (Brute Force style)&lt;/p&gt;

&lt;p&gt;This was my very first idea when I solved it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lengthOfLongestSubstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;max_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;lists&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;lists&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
                    &lt;span class="k"&gt;break&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;max_len&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                    &lt;span class="n"&gt;max_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;max_len&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What’s wrong with this solution?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Time complexity ≈ O(n³) → very slow for longer strings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using in on list is O(n) → big performance killer&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  My Optimal Way — Sliding Window (O(n) time)
&lt;/h2&gt;

&lt;p&gt;This is the approach almost everyone expects in interviews today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;lengthOfLongestSubstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;my_last_seen_char_in_s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;left_of_window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;max_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;right_of_window&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;my_last_seen_char_in_s&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;my_last_seen_char_in_s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;left_of_window&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;left_of_window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;my_last_seen_char_in_s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

            &lt;span class="n"&gt;my_last_seen_char_in_s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;right_of_window&lt;/span&gt;
            &lt;span class="n"&gt;max_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right_of_window&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;left_of_window&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;max_len&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why this is beautiful:&lt;/p&gt;

&lt;p&gt;1.Single pass → O(n) time&lt;br&gt;
2.Uses dictionary for instant lookup&lt;br&gt;
3.Smartly jumps the window when duplicate is found&lt;br&gt;
4.Very clean and easy to explain&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mahdi0shamlou/LeetCode" rel="noopener noreferrer"&gt;My repo (all solutions are here)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What about you? Which approach do you like most? Do you have any other creative solutions? Share in the comments — I read everything! 🚀&lt;/p&gt;

&lt;p&gt;Connect with me:&lt;/p&gt;

&lt;p&gt;🔗 LinkedIn: &lt;a href="https://www.linkedin.com/in/mahdi-shamlou-3b52b8278" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mahdi-shamlou-3b52b8278&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📱 Telegram: &lt;a href="https://telegram.me/mahdi0shamlou" rel="noopener noreferrer"&gt;https://telegram.me/mahdi0shamlou&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 Instagram: &lt;a href="https://www.instagram.com/mahdi0shamlou/" rel="noopener noreferrer"&gt;https://www.instagram.com/mahdi0shamlou/&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
Author: Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>coding</category>
      <category>interview</category>
      <category>leetcode</category>
    </item>
    <item>
      <title>Mahdi Shamlou | Solving LeetCode #2: Add Two Numbers — The Classic Linked List Addition</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Fri, 23 Jan 2026 16:51:55 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-2-add-two-numbers-the-classic-linked-list-addition-5g7c</link>
      <guid>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-2-add-two-numbers-the-classic-linked-list-addition-5g7c</guid>
      <description>&lt;p&gt;Hey everyone! I’m Mahdi Shamlou, and I’m continuing my new series on classic LeetCode problems. After the legendary Two Sum, let’s tackle the next one: Problem #2 — Add Two Numbers.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7rnw0pk3uq4ob1np4w4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7rnw0pk3uq4ob1np4w4.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;br&gt;
You can visit my LeetCode repo in my github 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mahdi0shamlou/LeetCode" rel="noopener noreferrer"&gt;https://github.com/mahdi0shamlou/LeetCode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a Medium difficulty problem, but it’s an absolute classic — it shows up a lot in coding interviews at big tech companies. Solving it well proves you’re comfortable with linked lists, pointer manipulation, and handling carry like in elementary school addition.&lt;/p&gt;
&lt;h2&gt;
  
  
  Problem Statement: Add Two Numbers
&lt;/h2&gt;

&lt;p&gt;You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each node contains a single digit.&lt;/p&gt;

&lt;p&gt;Add the two numbers and return the sum as a linked list (also in reverse order).&lt;/p&gt;
&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7tc0w0llridc8vh6vi6j.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7tc0w0llridc8vh6vi6j.webp" alt=" " width="483" height="342"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input: l1 = [0], l2 = [0]
Output: [0]
-------------------------
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
Output: [8,9,9,9,9,9,9,1]
Explanation: 9999999 + 9999 = 10009998
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A Cool &amp;amp; Unique Approach: Recursive Solution
&lt;/h2&gt;

&lt;p&gt;The most common way is iterative (using a dummy node and carry), which is super efficient and safe. But today, I want to share a more interesting and elegant recursive approach that I came up with — it’s less common, feels very functional, and beautifully mirrors how we think about addition digit-by-digit while propagating the carry.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea is simple:
&lt;/h2&gt;

&lt;p&gt;We create a helper recursive function that takes the current nodes from both lists and the carry from the previous digit.&lt;br&gt;
Add the values + carry, compute the new digit (% 10) and new carry.&lt;br&gt;
Recursively compute the next node.&lt;br&gt;
Handle cases where one list is longer by passing a dummy node with value 0.&lt;br&gt;
Base case: when both lists end and no carry left, return None.&lt;/p&gt;

&lt;p&gt;Here’s my Python solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Definition for singly-linked list.
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;addTwoNumbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;posetive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;l2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt;
        &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;posetive&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;posetive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;posetive&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
            &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;l2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;list_node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;posetive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;l2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;list_node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;posetive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;l2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;l1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;list_node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;posetive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;l2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;list_node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;posetive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;added&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;list_node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;posetive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list_node&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why this recursive approach is interesting:
&lt;/h2&gt;

&lt;p&gt;Elegant and intuitive — recursion naturally handles the “go to next digit” flow.&lt;br&gt;
Clean structure — no dummy nodes or while loops; the recursion tree builds the result bottom-up.&lt;br&gt;
Performance — O(max(n, m)) time and space, beats many submissions.&lt;/p&gt;

&lt;p&gt;That said, for very long lists (up to 100 nodes), Python’s recursion depth might be a concern, so iterative is safer in production. But this recursive version is super fun and impressive in interviews if you explain the edge cases well!&lt;/p&gt;

&lt;p&gt;If you prefer the standard iterative way or know other tricks, share in the comments! I’d love to hear and maybe cover them in a follow-up 🚀&lt;/p&gt;

&lt;p&gt;Any questions? I’m happy to help!&lt;/p&gt;

&lt;p&gt;Connect with me:&lt;/p&gt;

&lt;p&gt;🔗 LinkedIn: &lt;a href="https://www.linkedin.com/in/mahdi-shamlou-3b52b8278" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mahdi-shamlou-3b52b8278&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
📱 Telegram: &lt;a href="https://telegram.me/mahdi0shamlou" rel="noopener noreferrer"&gt;https://telegram.me/mahdi0shamlou&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
📸 Instagram: &lt;a href="https://www.instagram.com/mahdi0shamlou/" rel="noopener noreferrer"&gt;https://www.instagram.com/mahdi0shamlou/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Author: Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>interview</category>
      <category>leetcode</category>
      <category>programming</category>
    </item>
    <item>
      <title>Mahdi Shamlou | Solving LeetCode #1: Two Sum — The Classic Hash Map Solution</title>
      <dc:creator>Mahdi SHamlou | مهدی شاملو</dc:creator>
      <pubDate>Fri, 23 Jan 2026 16:38:08 +0000</pubDate>
      <link>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-1-two-sum-the-classic-hash-map-solution-4dfk</link>
      <guid>https://dev.to/mahdi0shamlou/mahdi-shamlou-solving-leetcode-1-two-sum-the-classic-hash-map-solution-4dfk</guid>
      <description>&lt;p&gt;Hey everyone! I’m Mahdi Shamlou, and I’m starting a new series on classic LeetCode problems. Let’s kick it off with the very first one: Problem #1 — Two Sum.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjjubxpsxnq8mla7wmxz.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjjubxpsxnq8mla7wmxz.webp" alt=" " width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is an Easy difficulty problem, but it’s legendary — it’s often the very first question in coding interviews at big tech companies. Solving it optimally shows you understand one of the most powerful tools in programming: hash maps (dictionaries in Python).&lt;br&gt;
Problem Statement: Two Sum&lt;/p&gt;

&lt;p&gt;Given an array of integers nums and an integer target, return the indices of the two numbers such that they add up to target.&lt;/p&gt;

&lt;p&gt;You may assume that each input has exactly one solution, and you may not use the same element twice. You can return the answer in any order.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: nums[0] + nums[1] = 2 + 7 = 9

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

Input: nums = [3,3], target = 6
Output: [0,1]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Optimal Approach: One-Pass Hash Map&lt;/p&gt;

&lt;p&gt;The brute force way would be to check every pair with two nested loops — that’s O(n²) time, which is too slow for large arrays.&lt;/p&gt;

&lt;p&gt;Instead, we use a dictionary to store numbers we’ve seen so far and their indices.&lt;br&gt;
Become a member&lt;/p&gt;

&lt;p&gt;As we iterate through the array:&lt;/p&gt;

&lt;p&gt;For each number nums[i], calculate the target_less:&lt;br&gt;
target — nums[i] 0  If the target_less is already in the dictionary, we’ve found our pair!&lt;br&gt;
Otherwise, add the current number and its index to the dictionary.&lt;br&gt;
This is one pass through the array → O(n) time and O(n) space.&lt;/p&gt;

&lt;p&gt;Here’s the Python solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;twoSum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;dict_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;target_less&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;target_less&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dict_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dict_key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;target_less&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

            &lt;span class="n"&gt;dict_key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why is this approach great?&lt;/p&gt;

&lt;p&gt;Super efficient: Beats 95%+ of submissions on LeetCode in time&lt;br&gt;
Clean and readable: Easy to explain in interviews&lt;br&gt;
Handles edge cases perfectly : like duplicate numbers&lt;/p&gt;

&lt;p&gt;If you know other methods feel free to share in the comments! I’d love to learn and maybe create a separate post about them 🚀&lt;/p&gt;

&lt;p&gt;Any questions? I’m happy to help!&lt;/p&gt;

&lt;p&gt;Connect with me:&lt;/p&gt;

&lt;p&gt;🔗 LinkedIn: &lt;a href="https://www.linkedin.com/in/mahdi-shamlou-3b52b8278" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/mahdi-shamlou-3b52b8278&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📱 Telegram: &lt;a href="https://telegram.me/mahdi0shamlou" rel="noopener noreferrer"&gt;https://telegram.me/mahdi0shamlou&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
📸 Instagram: &lt;a href="https://www.instagram.com/mahdi0shamlou/" rel="noopener noreferrer"&gt;https://www.instagram.com/mahdi0shamlou/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Author: Mahdi Shamlou | مهدی شاملو&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>beginners</category>
      <category>leetcode</category>
      <category>python</category>
    </item>
  </channel>
</rss>
