<?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: AussieCoder</title>
    <description>The latest articles on DEV Community by AussieCoder (@aaradhyanegi009).</description>
    <link>https://dev.to/aaradhyanegi009</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%2F3936711%2F432f66ee-a5fe-4b32-afa6-766777ce4130.png</url>
      <title>DEV Community: AussieCoder</title>
      <link>https://dev.to/aaradhyanegi009</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aaradhyanegi009"/>
    <language>en</language>
    <item>
      <title>LeetCode Solution: 8. String to Integer (atoi)</title>
      <dc:creator>AussieCoder</dc:creator>
      <pubDate>Mon, 18 May 2026 01:03:00 +0000</pubDate>
      <link>https://dev.to/aaradhyanegi009/leetcode-solution-8-string-to-integer-atoi-2jli</link>
      <guid>https://dev.to/aaradhyanegi009/leetcode-solution-8-string-to-integer-atoi-2jli</guid>
      <description>&lt;h1&gt;
  
  
  Cracking &lt;code&gt;atoi&lt;/code&gt;: How to Convert Strings to Integers with LeetCode 8
&lt;/h1&gt;

&lt;p&gt;Hey everyone! 👋 Aaradhya here, diving into another exciting LeetCode challenge. Today, we're tackling problem 8: "String to Integer (atoi)". This one sounds simple – just convert a string to a number, right? Well, as we'll see, &lt;code&gt;atoi&lt;/code&gt; is famous for its sneaky edge cases and makes for a fantastic exercise in robust parsing!&lt;/p&gt;

&lt;h2&gt;
  
  
  🧐 Problem Explanation: The &lt;code&gt;atoi&lt;/code&gt; Gauntlet
&lt;/h2&gt;

&lt;p&gt;Imagine you're building a calculator app, and users input numbers as text (like &lt;code&gt;"123"&lt;/code&gt; or &lt;code&gt;"-42"&lt;/code&gt;). Your job is to take that string and turn it into an actual integer your program can use for calculations. That's exactly what &lt;code&gt;myAtoi(string s)&lt;/code&gt; asks us to do!&lt;/p&gt;

&lt;p&gt;But it's not just a straightforward conversion. LeetCode throws in a few crucial rules that make this problem interesting:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Whitespace Whisperer:&lt;/strong&gt; First things first, ignore any leading spaces. Think of it like trimming a string before you start reading the juicy bits.

&lt;ul&gt;
&lt;li&gt;  Example: &lt;code&gt;"   -42"&lt;/code&gt; should become &lt;code&gt;"-42"&lt;/code&gt; after ignoring spaces.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Sign Detective:&lt;/strong&gt; After the spaces, look for a &lt;code&gt;'-'&lt;/code&gt; or &lt;code&gt;'+'&lt;/code&gt;. This determines if your number is negative or positive. If neither is present, assume it's a positive number.

&lt;ul&gt;
&lt;li&gt;  Example: &lt;code&gt;" -042"&lt;/code&gt; the &lt;code&gt;'-'&lt;/code&gt; tells us it's negative. &lt;code&gt;"42"&lt;/code&gt; is positive by default.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Digit Dynamo:&lt;/strong&gt; Now, start reading digits (&lt;code&gt;0-9&lt;/code&gt;) one by one. Keep going until you hit a character that isn't a digit, or you reach the end of the string.

&lt;ul&gt;
&lt;li&gt;  Important: If you don't find &lt;em&gt;any&lt;/em&gt; digits after handling whitespace and sign, the result is &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Example: &lt;code&gt;"1337c0d3"&lt;/code&gt; becomes &lt;code&gt;1337&lt;/code&gt; because &lt;code&gt;c&lt;/code&gt; isn't a digit. &lt;code&gt;"words and 987"&lt;/code&gt; becomes &lt;code&gt;0&lt;/code&gt; because &lt;code&gt;w&lt;/code&gt; isn't a digit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Range Ranger (Clamping):&lt;/strong&gt; The final integer must fit within the 32-bit signed integer range, which is &lt;code&gt;[-2^31, 2^31 - 1]&lt;/code&gt;.

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;INT_MAX&lt;/code&gt; is &lt;code&gt;2147483647&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;INT_MIN&lt;/code&gt; is &lt;code&gt;-2147483648&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  If your number is too small (e.g., &lt;code&gt;-99999999999&lt;/code&gt;), it gets "rounded" (clamped) to &lt;code&gt;INT_MIN&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  If your number is too big (e.g., &lt;code&gt;99999999999&lt;/code&gt;), it gets clamped to &lt;code&gt;INT_MAX&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's quickly look at an example to tie it all together:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; &lt;code&gt;s = " -042"&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Step 1 (Whitespace):&lt;/strong&gt; &lt;code&gt;"   -042"&lt;/code&gt; -&amp;gt; We ignore the three leading spaces. Our reading starts at &lt;code&gt;'-'&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Step 2 (Signedness):&lt;/strong&gt; &lt;code&gt;"-042"&lt;/code&gt; -&amp;gt; We see &lt;code&gt;'-'&lt;/code&gt;, so our number will be negative.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Step 3 (Conversion):&lt;/strong&gt; &lt;code&gt;"-042"&lt;/code&gt; -&amp;gt; We read &lt;code&gt;0&lt;/code&gt;, then &lt;code&gt;4&lt;/code&gt;, then &lt;code&gt;2&lt;/code&gt;. The &lt;code&gt;0&lt;/code&gt; is a leading zero, so it doesn't change the value &lt;code&gt;42&lt;/code&gt;. We stop after &lt;code&gt;2&lt;/code&gt; as the string ends.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Step 4 (Rounding):&lt;/strong&gt; The number is &lt;code&gt;-42&lt;/code&gt;. This is well within &lt;code&gt;INT_MIN&lt;/code&gt; and &lt;code&gt;INT_MAX&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Output:&lt;/strong&gt; &lt;code&gt;-42&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See? There are quite a few rules to follow meticulously!&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Intuition: It's a State Machine!
&lt;/h2&gt;

&lt;p&gt;My "aha!" moment for &lt;code&gt;atoi&lt;/code&gt; usually comes when I realize it's not just one big transformation, but a sequence of small, specific steps. It's like a little &lt;strong&gt;state machine&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;State 1:&lt;/strong&gt; Looking for non-whitespace.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;State 2:&lt;/strong&gt; Looking for a sign (&lt;code&gt;+&lt;/code&gt; or &lt;code&gt;-&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;State 3:&lt;/strong&gt; Accumulating digits.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;State 4:&lt;/strong&gt; Done, apply final checks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key insight is that we need to process the string character by character, making decisions and updating our current state (like the sign and the number we've built so far). And the most crucial "gotcha" to watch out for is &lt;strong&gt;integer overflow&lt;/strong&gt;! Since &lt;code&gt;result * 10&lt;/code&gt; can quickly exceed &lt;code&gt;INT_MAX&lt;/code&gt;, we need a way to detect and handle this &lt;em&gt;before&lt;/em&gt; it actually overflows our &lt;code&gt;int&lt;/code&gt; variable.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Approach: A Step-by-Step Breakdown
&lt;/h2&gt;

&lt;p&gt;Let's break down how we can implement &lt;code&gt;myAtoi&lt;/code&gt; in a robust, step-by-step manner. We'll use an iterative approach, which is generally cleaner for managing the sequential steps and overflow checks in this problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 0: Essential Tools and Constants
&lt;/h3&gt;

&lt;p&gt;We'll need &lt;code&gt;INT_MAX&lt;/code&gt; (2,147,483,647) and &lt;code&gt;INT_MIN&lt;/code&gt; (-2,147,483,648) from the &lt;code&gt;&amp;lt;climits&amp;gt;&lt;/code&gt; header to perform our range checks. We'll also use &lt;code&gt;long long&lt;/code&gt; for our intermediate number to prevent overflow &lt;em&gt;before&lt;/em&gt; we clamp it to &lt;code&gt;int&lt;/code&gt; limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Skip Leading Whitespace
&lt;/h3&gt;

&lt;p&gt;We'll use an index &lt;code&gt;i&lt;/code&gt; to iterate through the string. The first thing we do is advance &lt;code&gt;i&lt;/code&gt; past any &lt;code&gt;' '&lt;/code&gt; characters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&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="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while&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;&amp;lt;&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;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&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="sc"&gt;' '&lt;/span&gt;&lt;span class="p"&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="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Move past the space&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Determine the Sign
&lt;/h3&gt;

&lt;p&gt;After skipping spaces, the next non-space character (if any) could be a sign (&lt;code&gt;+&lt;/code&gt; or &lt;code&gt;-&lt;/code&gt;).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Initialize &lt;code&gt;sign = 1&lt;/code&gt; (defaulting to positive).&lt;/li&gt;
&lt;li&gt;  If we find &lt;code&gt;'-'&lt;/code&gt;, set &lt;code&gt;sign = -1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  If we find &lt;code&gt;'+'&lt;/code&gt;, &lt;code&gt;sign&lt;/code&gt; remains &lt;code&gt;1&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  In either case, increment &lt;code&gt;i&lt;/code&gt; to move past the sign character.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&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="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Assume positive initially&lt;/span&gt;
&lt;span class="k"&gt;if&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;&amp;lt;&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;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&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="o"&gt;==&lt;/span&gt; &lt;span class="sc"&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;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'+'&lt;/span&gt;&lt;span class="p"&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="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="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;)&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="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="c1"&gt;// If it's '-', sign is -1, else 1&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Move past the sign character&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Convert Digits and Handle Overflow (The Heart of the Problem)
&lt;/h3&gt;

&lt;p&gt;This is where we build our number and constantly check if it's getting too big or too small.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  We'll use a &lt;code&gt;long long&lt;/code&gt; variable, let's call it &lt;code&gt;result&lt;/code&gt;, initialized to &lt;code&gt;0&lt;/code&gt;. This is crucial because the number might temporarily exceed &lt;code&gt;INT_MAX&lt;/code&gt; before we clamp it.&lt;/li&gt;
&lt;li&gt;  We'll loop while &lt;code&gt;i&lt;/code&gt; is within bounds and &lt;code&gt;s[i]&lt;/code&gt; is a digit.&lt;/li&gt;
&lt;li&gt;  Inside the loop:

&lt;ol&gt;
&lt;li&gt; Extract the digit: &lt;code&gt;int digit = s[i] - '0';&lt;/code&gt; (e.g., &lt;code&gt;'5' - '0'&lt;/code&gt; gives &lt;code&gt;5&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; Update &lt;code&gt;result&lt;/code&gt;: &lt;code&gt;result = result * 10 + digit;&lt;/code&gt; (This is how you build a number from digits).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Perform Overflow Checks!&lt;/strong&gt; This is the most critical part. We need to check &lt;em&gt;at each step&lt;/em&gt; if &lt;code&gt;result&lt;/code&gt; (even though it's &lt;code&gt;long long&lt;/code&gt;) indicates that the final clamped &lt;code&gt;int&lt;/code&gt; would go out of range.

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;For Positive Numbers:&lt;/strong&gt; If &lt;code&gt;sign&lt;/code&gt; is &lt;code&gt;1&lt;/code&gt; and our &lt;code&gt;result&lt;/code&gt; (which is always positive here) has already surpassed &lt;code&gt;INT_MAX&lt;/code&gt;, we know the final answer must be &lt;code&gt;INT_MAX&lt;/code&gt;. We can return &lt;code&gt;INT_MAX&lt;/code&gt; immediately.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;For Negative Numbers:&lt;/strong&gt; If &lt;code&gt;sign&lt;/code&gt; is &lt;code&gt;-1&lt;/code&gt; and our &lt;code&gt;result&lt;/code&gt; (its absolute value) has surpassed the magnitude of &lt;code&gt;INT_MIN&lt;/code&gt; (&lt;code&gt;2147483648&lt;/code&gt;), we know the final answer must be &lt;code&gt;INT_MIN&lt;/code&gt;. Remember &lt;code&gt;INT_MIN&lt;/code&gt;'s absolute value is &lt;code&gt;INT_MAX + 1&lt;/code&gt;. So, if &lt;code&gt;result &amp;gt; (long long)INT_MAX + 1&lt;/code&gt;, we return &lt;code&gt;INT_MIN&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt; Increment &lt;code&gt;i&lt;/code&gt; to move to the next character.
&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="kt"&gt;long&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="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Use long long to handle potentially large intermediate values&lt;/span&gt;

&lt;span class="k"&gt;while&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;&amp;lt;&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;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;isdigit&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="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Loop while we have digits&lt;/span&gt;
    &lt;span class="kt"&gt;int&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;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="sc"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Convert character digit to integer&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="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Build the number&lt;/span&gt;

    &lt;span class="c1"&gt;// Overflow check for positive numbers&lt;/span&gt;
    &lt;span class="k"&gt;if&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="o"&gt;&amp;amp;&amp;amp;&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="n"&gt;INT_MAX&lt;/span&gt;&lt;span class="p"&gt;)&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&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;// Overflow check for negative numbers&lt;/span&gt;
    &lt;span class="c1"&gt;// Note: INT_MIN is -2147483648, while INT_MAX is 2147483647.&lt;/span&gt;
    &lt;span class="c1"&gt;// So, for negative numbers, the absolute value can be one larger than INT_MAX.&lt;/span&gt;
    &lt;span class="k"&gt;if&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="o"&gt;&amp;amp;&amp;amp;&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="kt"&gt;long&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;INT_MAX&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="p"&gt;{&lt;/span&gt; 
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;INT_MIN&lt;/span&gt;&lt;span class="p"&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="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Move to the next digit&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Apply Sign and Return
&lt;/h3&gt;

&lt;p&gt;Finally, once we're done parsing all digits (or ran into a non-digit), we apply the determined &lt;code&gt;sign&lt;/code&gt; to our &lt;code&gt;result&lt;/code&gt; and cast it back to an &lt;code&gt;int&lt;/code&gt;. Since we handled all overflows during step 3, this final cast will safely return the correct, clamped 32-bit integer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&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="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Combining all these steps gives us a complete and robust &lt;code&gt;atoi&lt;/code&gt; function!&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 Code: My &lt;code&gt;atoi&lt;/code&gt; Implementation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt;   // For std::string&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;climits&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt;  // For INT_MAX, INT_MIN&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cctype&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt;   // For isdigit (good practice to include explicitly)&lt;/span&gt;&lt;span class="cp"&gt;
&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="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;myAtoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&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="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Step 1: Skip leading whitespace&lt;/span&gt;
        &lt;span class="k"&gt;while&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;&amp;lt;&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;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&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="sc"&gt;' '&lt;/span&gt;&lt;span class="p"&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="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Step 2: Determine sign&lt;/span&gt;
        &lt;span class="kt"&gt;int&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="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Assume positive initially&lt;/span&gt;
        &lt;span class="k"&gt;if&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;&amp;lt;&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;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&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="o"&gt;==&lt;/span&gt; &lt;span class="sc"&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;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'+'&lt;/span&gt;&lt;span class="p"&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="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="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'-'&lt;/span&gt;&lt;span class="p"&gt;)&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="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="c1"&gt;// If it's '-', sign is -1, else 1&lt;/span&gt;
            &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Move past the sign character&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Step 3: Convert digits and handle overflow&lt;/span&gt;
        &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="kt"&gt;long&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="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Use long long to handle potentially large intermediate values&lt;/span&gt;

        &lt;span class="c1"&gt;// Loop while we have characters and they are digits&lt;/span&gt;
        &lt;span class="k"&gt;while&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;&amp;lt;&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;length&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;isdigit&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="p"&gt;{&lt;/span&gt; 
            &lt;span class="kt"&gt;int&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;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="sc"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Convert character digit to integer&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="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Build the number&lt;/span&gt;

            &lt;span class="c1"&gt;// Critical Overflow Checks!&lt;/span&gt;
            &lt;span class="c1"&gt;// If the number is positive and exceeds INT_MAX&lt;/span&gt;
            &lt;span class="k"&gt;if&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="o"&gt;&amp;amp;&amp;amp;&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="n"&gt;INT_MAX&lt;/span&gt;&lt;span class="p"&gt;)&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&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="c1"&gt;// If the number is negative and its absolute value exceeds the magnitude of INT_MIN&lt;/span&gt;
            &lt;span class="c1"&gt;// The magnitude of INT_MIN (-2147483648) is 2147483648, which is INT_MAX + 1.&lt;/span&gt;
            &lt;span class="k"&gt;if&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="o"&gt;&amp;amp;&amp;amp;&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="kt"&gt;long&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;INT_MAX&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="p"&gt;{&lt;/span&gt; 
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;INT_MIN&lt;/span&gt;&lt;span class="p"&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="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Move to the next digit&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Step 4: Apply sign and return the final integer&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&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="n"&gt;result&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⏱️ Time &amp;amp; Space Complexity Analysis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Time Complexity: O(N)&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  We iterate through the input string &lt;code&gt;s&lt;/code&gt; at most once. Each character is processed a constant number of times (whitespace skip, sign check, digit conversion). &lt;code&gt;N&lt;/code&gt; is the length of the string.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;Space Complexity: O(1)&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  We only use a few constant-size variables (&lt;code&gt;i&lt;/code&gt;, &lt;code&gt;sign&lt;/code&gt;, &lt;code&gt;result&lt;/code&gt;, &lt;code&gt;digit&lt;/code&gt;). No additional data structures are created that depend on the input size.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✨ Key Takeaways
&lt;/h2&gt;

&lt;p&gt;Solving &lt;code&gt;atoi&lt;/code&gt; is more than just converting a string to a number; it's a masterclass in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Careful Parsing:&lt;/strong&gt; Breaking down a complex problem into sequential, manageable steps.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Edge Case Handling:&lt;/strong&gt; Systematically addressing scenarios like leading spaces, signs, non-digit characters, and empty inputs.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Overflow Prevention:&lt;/strong&gt; Understanding integer limits (&lt;code&gt;INT_MAX&lt;/code&gt;, &lt;code&gt;INT_MIN&lt;/code&gt;) and using a &lt;code&gt;long long&lt;/code&gt; for intermediate calculations to proactively prevent data type overflows, followed by precise clamping.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Clarity:&lt;/strong&gt; An iterative approach often makes the "state changes" and decision points clearer for problems like &lt;code&gt;atoi&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This problem is a fantastic way to sharpen your attention to detail and write robust code. Keep practicing, and you'll be parsing strings like a pro in no time! Happy coding!&lt;/p&gt;




&lt;p&gt;Author Account: aaradhyanegi009&lt;br&gt;
Publishing Time: 2026-05-18 06:32:19&lt;/p&gt;

</description>
      <category>leetcode</category>
      <category>dsa</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>LeetCode Solution: 7. Reverse Integer</title>
      <dc:creator>AussieCoder</dc:creator>
      <pubDate>Mon, 18 May 2026 01:00:35 +0000</pubDate>
      <link>https://dev.to/aaradhyanegi009/leetcode-solution-7-reverse-integer-1afe</link>
      <guid>https://dev.to/aaradhyanegi009/leetcode-solution-7-reverse-integer-1afe</guid>
      <description>&lt;h1&gt;
  
  
  Cracking LeetCode 7: How to Reverse an Integer Safely (and Why It's Tricky!)
&lt;/h1&gt;

&lt;p&gt;Hey awesome developers! 👋 Welcome back to another exciting LeetCode breakdown with aaradhyanegi009. Today, we're diving into a classic problem that seems simple on the surface but hides a crucial twist: &lt;strong&gt;Reversing an Integer&lt;/strong&gt;. It's a fantastic exercise for understanding integer manipulation and, more importantly, how to deal with the dreaded "integer overflow."&lt;/p&gt;

&lt;p&gt;Let's get started!&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Problem Explanation: Reverse Integer (LeetCode #7)
&lt;/h2&gt;

&lt;p&gt;You're given a signed 32-bit integer, let's call it &lt;code&gt;x&lt;/code&gt;. Your task is to return this integer with its digits reversed. Sounds easy, right?&lt;/p&gt;

&lt;p&gt;Here's the catch:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Signed 32-bit integer range:&lt;/strong&gt; This means &lt;code&gt;x&lt;/code&gt; can be anywhere from -2,147,483,648 to 2,147,483,647.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Overflow Check:&lt;/strong&gt; If the reversed version of &lt;code&gt;x&lt;/code&gt; goes &lt;strong&gt;outside&lt;/strong&gt; this 32-bit signed integer range, you must return &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;No 64-bit integers (for final result):&lt;/strong&gt; You're &lt;em&gt;assumed&lt;/em&gt; not to be able to store 64-bit integers. This implies that your final &lt;em&gt;return value&lt;/em&gt; should fit within a 32-bit integer, and you need clever ways to detect overflow without relying on a larger type for the &lt;em&gt;final&lt;/em&gt; result.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Let's look at some examples:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt; &lt;code&gt;x = 123&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Output: &lt;code&gt;321&lt;/code&gt; (Simple reversal)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt; &lt;code&gt;x = -123&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Output: &lt;code&gt;-321&lt;/code&gt; (Negative sign needs to be preserved)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Example 3:&lt;/strong&gt; &lt;code&gt;x = 120&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Output: &lt;code&gt;21&lt;/code&gt; (Trailing zeros become leading zeros and disappear)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Intuition: The "Aha!" Moment
&lt;/h2&gt;

&lt;p&gt;When you think about reversing digits, two main strategies often come to mind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mathematical Approach:&lt;/strong&gt; Repeatedly extract the last digit (&lt;code&gt;x % 10&lt;/code&gt;), build the reversed number (&lt;code&gt;reversed = reversed * 10 + digit&lt;/code&gt;), and truncate &lt;code&gt;x&lt;/code&gt; (&lt;code&gt;x /= 10&lt;/code&gt;). This is efficient but makes overflow checking a bit more intricate, as you need to check &lt;em&gt;before&lt;/em&gt; each multiplication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;String Conversion Approach:&lt;/strong&gt; Convert the number to a string, reverse the string, and then convert it back to a number. This often feels more intuitive for reversing sequences and can simplify overflow detection, as you perform the reversal first and then check the final value.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For this problem, especially given the "no 64-bit integers" constraint (which is often interpreted as "don't &lt;em&gt;return&lt;/em&gt; a 64-bit integer, but you might use it &lt;em&gt;temporarily&lt;/em&gt; for safety checks"), the &lt;strong&gt;string conversion approach&lt;/strong&gt; combined with careful type handling provides a very robust and readable solution.&lt;/p&gt;

&lt;p&gt;The "aha!" here is realizing that a &lt;code&gt;long long&lt;/code&gt; (which is typically 64-bit) can be your best friend for &lt;em&gt;intermediate&lt;/em&gt; calculations and overflow checks, even if your final answer must fit in an &lt;code&gt;int&lt;/code&gt; (32-bit). You build the potentially overflowing number in a &lt;code&gt;long long&lt;/code&gt;, then compare it against the &lt;code&gt;INT_MAX&lt;/code&gt; and &lt;code&gt;INT_MIN&lt;/code&gt; boundaries &lt;em&gt;before&lt;/em&gt; casting it back to an &lt;code&gt;int&lt;/code&gt;. This way, you catch overflows safely.&lt;/p&gt;




&lt;h2&gt;
  
  
  📋 Approach: Step-by-Step Logic
&lt;/h2&gt;

&lt;p&gt;Our chosen approach leverages string manipulation for the reversal and &lt;code&gt;long long&lt;/code&gt; for safe overflow detection.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preserve the Sign and Get Absolute Value:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  First, we need to know if the original &lt;code&gt;x&lt;/code&gt; was negative. We'll store its sign and work with its absolute value. This simplifies the reversal process, as we don't have to worry about the negative sign until the very end.&lt;/li&gt;
&lt;li&gt;  We store &lt;code&gt;x&lt;/code&gt; in a &lt;code&gt;long long&lt;/code&gt; variable (&lt;code&gt;val&lt;/code&gt;) right away to prevent any potential overflow issues if &lt;code&gt;x&lt;/code&gt; itself is &lt;code&gt;INT_MIN&lt;/code&gt; (which behaves strangely with &lt;code&gt;abs()&lt;/code&gt; in some contexts).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Convert to String:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Convert the absolute value of &lt;code&gt;val&lt;/code&gt; into a &lt;code&gt;string&lt;/code&gt;. This allows us to easily manipulate its digits. For &lt;code&gt;x = 123&lt;/code&gt;, &lt;code&gt;num&lt;/code&gt; becomes &lt;code&gt;"123"&lt;/code&gt;. For &lt;code&gt;x = -123&lt;/code&gt;, &lt;code&gt;num&lt;/code&gt; becomes &lt;code&gt;"123"&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reverse the String:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Use a standard library function (like &lt;code&gt;std::reverse&lt;/code&gt; in C++) to reverse the &lt;code&gt;num&lt;/code&gt; string. &lt;code&gt;"123"&lt;/code&gt; becomes &lt;code&gt;"321"&lt;/code&gt;, and &lt;code&gt;"12"&lt;/code&gt; becomes &lt;code&gt;"21"&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Convert Back to Number (Safely!):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Convert the reversed string back into a numerical type. Here's where &lt;code&gt;long long&lt;/code&gt; shines! We convert it into a &lt;code&gt;long long&lt;/code&gt; (&lt;code&gt;res&lt;/code&gt;) using &lt;code&gt;stoll()&lt;/code&gt; (string to long long). This lets &lt;code&gt;res&lt;/code&gt; temporarily hold values larger than &lt;code&gt;INT_MAX&lt;/code&gt; or smaller than &lt;code&gt;INT_MIN&lt;/code&gt; without crashing, so we can &lt;em&gt;then&lt;/em&gt; check them.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reapply the Original Sign:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  If the original &lt;code&gt;x&lt;/code&gt; was negative (checked by &lt;code&gt;x &amp;lt; 0&lt;/code&gt;), multiply our &lt;code&gt;res&lt;/code&gt; by &lt;code&gt;-1&lt;/code&gt; to restore its negative sign.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Perform Overflow Check:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Now that we have the final &lt;code&gt;res&lt;/code&gt; as a &lt;code&gt;long long&lt;/code&gt;, we compare it against the &lt;code&gt;INT_MAX&lt;/code&gt; (2,147,483,647) and &lt;code&gt;INT_MIN&lt;/code&gt; (-2,147,483,648) limits.&lt;/li&gt;
&lt;li&gt;  If &lt;code&gt;res&lt;/code&gt; is greater than &lt;code&gt;INT_MAX&lt;/code&gt; or less than &lt;code&gt;INT_MIN&lt;/code&gt;, it means the reversed integer overflows a 32-bit signed integer. In this case, as per the problem, we return &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Return the Result:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  If no overflow occurred, we know &lt;code&gt;res&lt;/code&gt; perfectly fits into a 32-bit integer. We cast &lt;code&gt;res&lt;/code&gt; to an &lt;code&gt;int&lt;/code&gt; and return it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach gracefully handles negative numbers, trailing zeros, and the all-important overflow condition, while respecting the underlying 32-bit integer limits for the final result.&lt;/p&gt;




&lt;h2&gt;
  
  
  💻 Code
&lt;/h2&gt;

&lt;p&gt;Here's the C++ implementation following our approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt;    // Required for std::string, to_string, stoll&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;algorithm&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt; // Required for std::reverse&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;limits&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt;    // Required for INT_MAX, INT_MIN (or just use &amp;lt;climits&amp;gt;)&lt;/span&gt;&lt;span class="cp"&gt;
&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="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Use INT_MAX and INT_MIN from &amp;lt;limits&amp;gt; for clarity&lt;/span&gt;
        &lt;span class="c1"&gt;// Or directly use numeric_limits&amp;lt;int&amp;gt;::max() / min()&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;max_V&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;numeric_limits&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;min_V&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;numeric_limits&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Use long long to safely store x initially. &lt;/span&gt;
        &lt;span class="c1"&gt;// This is crucial for handling INT_MIN correctly with abs() if used directly.&lt;/span&gt;
        &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="kt"&gt;long&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;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

        &lt;span class="c1"&gt;// 1. Convert absolute value of the number to a string&lt;/span&gt;
        &lt;span class="c1"&gt;// abs() ensures we work with positive digits first&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; 

        &lt;span class="c1"&gt;// 2. Reverse the string&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;reverse&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="n"&gt;begin&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="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

        &lt;span class="c1"&gt;// 3. Convert the reversed string back to a long long.&lt;/span&gt;
        &lt;span class="c1"&gt;// This allows us to temporarily hold a value that might exceed int limits&lt;/span&gt;
        &lt;span class="c1"&gt;// before we perform the overflow check.&lt;/span&gt;
        &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;stoll&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="c1"&gt;// 4. Reapply the original sign&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&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="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;res&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="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// 5. Check for 32-bit integer overflow/underflow&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;max_V&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;min_V&lt;/span&gt;&lt;span class="p"&gt;)&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="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Return 0 if the reversed integer is out of range&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// 6. If no overflow, cast the long long result back to int and return&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&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;res&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⏱️ Time &amp;amp; Space Complexity Analysis
&lt;/h2&gt;

&lt;p&gt;Let's break down the efficiency of this solution:&lt;/p&gt;

&lt;h3&gt;
  
  
  Time Complexity: &lt;code&gt;O(log10(x))&lt;/code&gt; or &lt;code&gt;O(1)&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;std::to_string(std::abs(val))&lt;/code&gt;&lt;/strong&gt;: The time taken to convert an integer to a string is proportional to the number of digits in the integer. If &lt;code&gt;D&lt;/code&gt; is the number of digits in &lt;code&gt;x&lt;/code&gt;, this is &lt;code&gt;O(D)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;std::reverse(num.begin(), num.end())&lt;/code&gt;&lt;/strong&gt;: Reversing a string of length &lt;code&gt;D&lt;/code&gt; takes &lt;code&gt;O(D)&lt;/code&gt; time.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;std::stoll(num)&lt;/code&gt;&lt;/strong&gt;: Converting a string back to a &lt;code&gt;long long&lt;/code&gt; also takes time proportional to the number of digits, &lt;code&gt;O(D)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a 32-bit integer, the maximum number of digits is 10 (e.g., 2,147,483,647). Since &lt;code&gt;D&lt;/code&gt; is effectively a constant for fixed-size integers, the operations are constant time relative to the number of digits. Therefore, the overall time complexity is often considered &lt;strong&gt;&lt;code&gt;O(1)&lt;/code&gt;&lt;/strong&gt; for practical purposes in competitive programming context where the input integer's size is fixed (32-bit). If we consider &lt;code&gt;x&lt;/code&gt; to be arbitrarily large, it would be &lt;code&gt;O(log10(x))&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Space Complexity: &lt;code&gt;O(log10(x))&lt;/code&gt; or &lt;code&gt;O(1)&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;std::string num&lt;/code&gt;&lt;/strong&gt;: We create a string to store the digits of &lt;code&gt;x&lt;/code&gt;. The length of this string is &lt;code&gt;D&lt;/code&gt;, the number of digits in &lt;code&gt;x&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Similar to time complexity, for a 32-bit integer, &lt;code&gt;D&lt;/code&gt; is at most 10, making the space usage effectively constant. Thus, the space complexity is often considered &lt;strong&gt;&lt;code&gt;O(1)&lt;/code&gt;&lt;/strong&gt;. If &lt;code&gt;x&lt;/code&gt; were arbitrarily large, it would be &lt;code&gt;O(log10(x))&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;String Power:&lt;/strong&gt; Don't underestimate the power of string conversions for digit-based problems. They can simplify complex logic like reversal and often offer good readability.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Overflow is King:&lt;/strong&gt; In integer problems, handling overflow is paramount. Always consider the data type limits (&lt;code&gt;INT_MAX&lt;/code&gt;, &lt;code&gt;INT_MIN&lt;/code&gt;) and how your operations might exceed them.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Temporary &lt;code&gt;long long&lt;/code&gt; (or Wider Types):&lt;/strong&gt; Even if the problem constraints state that the &lt;em&gt;final result&lt;/em&gt; must fit into a smaller type (like &lt;code&gt;int&lt;/code&gt;), you can often use a wider type (&lt;code&gt;long long&lt;/code&gt;) for &lt;em&gt;intermediate calculations&lt;/em&gt; or for checking potential overflow before clamping the final result. This is a common and safe pattern.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Edge Cases:&lt;/strong&gt; Always test with edge cases like negative numbers (&lt;code&gt;-123&lt;/code&gt;), numbers ending in zero (&lt;code&gt;120&lt;/code&gt;), and boundary values (&lt;code&gt;INT_MAX&lt;/code&gt;, &lt;code&gt;INT_MIN&lt;/code&gt;, or their reversed versions if they exist).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This problem serves as an excellent reminder that even seemingly simple tasks can have hidden complexities, pushing us to write more robust and error-resistant code. Keep coding, keep learning!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Authored by &lt;a href="https://dev.to/aaradhyanegi009"&gt;aaradhyanegi009&lt;/a&gt; | Published on 2026-05-18 06:29:57&lt;/em&gt;&lt;/p&gt;

</description>
      <category>leetcode</category>
      <category>dsa</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>LeetCode Solution: 146. LRU Cache</title>
      <dc:creator>AussieCoder</dc:creator>
      <pubDate>Sun, 17 May 2026 19:19:15 +0000</pubDate>
      <link>https://dev.to/aaradhyanegi009/leetcode-solution-146-lru-cache-4aen</link>
      <guid>https://dev.to/aaradhyanegi009/leetcode-solution-146-lru-cache-4aen</guid>
      <description>&lt;h1&gt;
  
  
  LRU Cache: Because Your Computer Has Commitment Issues (LeetCode 146)
&lt;/h1&gt;

&lt;p&gt;Hello, fellow coders and aspiring digital hoarders! Today, we're diving into a LeetCode classic that’s as common in interviews as "tell me about yourself" – the &lt;strong&gt;LRU Cache&lt;/strong&gt;. If you've ever wondered how your web browser remembers your favorite sites, or why some app data seems to magically stay while older stuff vanishes, you're about to find out!&lt;/p&gt;




&lt;h3&gt;
  
  
  The Problem: Your Computer's Short-Term Memory
&lt;/h3&gt;

&lt;p&gt;Imagine you have a super-important, but very small, desk. You can only fit a &lt;code&gt;capacity&lt;/code&gt; number of items on it. When you &lt;code&gt;put&lt;/code&gt; a new item on the desk:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; If the item is already there, you just update its content and put it on top (making it shiny and new).&lt;/li&gt;
&lt;li&gt; If it's new, you add it to the desk.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Crucially:&lt;/strong&gt; If adding this new item means your desk is now overflowing, you &lt;em&gt;must&lt;/em&gt; throw away the item you haven't touched in the longest time. We call this the "Least Recently Used" (LRU) item. Out with the old, in with the slightly less old, maybe!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you &lt;code&gt;get&lt;/code&gt; an item from the desk:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; If it's there, great! You pick it up, use it, and then put it back on top of the desk (making it the &lt;em&gt;most&lt;/em&gt; recently used).&lt;/li&gt;
&lt;li&gt; If it's not there, well, that's just awkward. You return -1.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The catch? Both &lt;code&gt;get&lt;/code&gt; and &lt;code&gt;put&lt;/code&gt; operations &lt;em&gt;must&lt;/em&gt; be ridiculously fast, specifically &lt;strong&gt;O(1) on average&lt;/strong&gt;. Because nobody has time for slow memory.&lt;/p&gt;




&lt;h3&gt;
  
  
  Intuition: The "Aha!" Moment 💡
&lt;/h3&gt;

&lt;p&gt;At first glance, this problem might seem like a digital version of "Simon Says" with extra steps. You need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Find things fast:&lt;/strong&gt; If you have &lt;code&gt;key&lt;/code&gt; 10, you need to grab its &lt;code&gt;value&lt;/code&gt; immediately. A plain list would mean searching through everything, which is O(N) – no good for our O(1) requirement. This screams &lt;strong&gt;Hash Map&lt;/strong&gt;! A &lt;code&gt;map&lt;/code&gt; (or &lt;code&gt;unordered_map&lt;/code&gt; in C++) lets us look up a &lt;code&gt;key&lt;/code&gt; and get its &lt;code&gt;value&lt;/code&gt; in average O(1) time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maintain order and recency:&lt;/strong&gt; How do we know what's LRU or MRU? A simple array won't work, because moving items around in an array (to make something MRU) is also O(N). We need something where we can easily remove an item from the middle and add it to the end (or beginning) in O(1) time. This, my friends, is the job for a &lt;strong&gt;Doubly Linked List&lt;/strong&gt;! With &lt;code&gt;prev&lt;/code&gt; and &lt;code&gt;next&lt;/code&gt; pointers, a node can be unlinked and relinked with constant pointer manipulations.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, the "aha!" moment is realizing we need &lt;strong&gt;both&lt;/strong&gt; of them. The Hash Map gives us O(1) access to &lt;em&gt;any&lt;/em&gt; item by its &lt;code&gt;key&lt;/code&gt;, and crucially, it will store a &lt;em&gt;pointer&lt;/em&gt; to that item's location in our Doubly Linked List. The Doubly Linked List then maintains the usage order, making it trivial to identify the LRU item (the one at the tail) and move an item to the MRU position (the head).&lt;/p&gt;




&lt;h3&gt;
  
  
  Approach: The Dynamic Duo Strikes Back!
&lt;/h3&gt;

&lt;p&gt;Our strategy is simple yet elegant, like a perfectly optimized pantry:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Dynamic Duo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  We'll use a &lt;code&gt;std::unordered_map&amp;lt;int, ListNode*&amp;gt;&lt;/code&gt; (let's call it &lt;code&gt;cacheMap&lt;/code&gt;) to map each &lt;code&gt;key&lt;/code&gt; to its corresponding &lt;code&gt;ListNode&lt;/code&gt; in our linked list. This gives us lightning-fast lookups (&lt;code&gt;key -&amp;gt; node&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  We'll use a &lt;code&gt;Doubly Linked List&lt;/code&gt; to keep track of the access order. The &lt;code&gt;head&lt;/code&gt; of our list will always point to the Most Recently Used (MRU) item, and the &lt;code&gt;tail&lt;/code&gt; will point to the Least Recently Used (LRU) item. To simplify things, we'll use "dummy" &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;tail&lt;/code&gt; nodes that don't store actual data. They just act as bookends, making insertions and deletions much cleaner.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The &lt;code&gt;ListNode&lt;/code&gt; Structure:&lt;/strong&gt;&lt;br&gt;
Each node in our doubly linked list will be a &lt;code&gt;struct ListNode&lt;/code&gt; containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;key&lt;/code&gt;: The actual key stored.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;value&lt;/code&gt;: The value associated with the key.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;prev&lt;/code&gt;: A pointer to the previous node.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;next&lt;/code&gt;: A pointer to the next node.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Core Operations (&lt;code&gt;deleteNode&lt;/code&gt;, &lt;code&gt;insertNode&lt;/code&gt;):&lt;/strong&gt;&lt;br&gt;
These are our utility belt items, doing the heavy lifting in O(1):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;deleteNode(node)&lt;/code&gt;: Takes a &lt;code&gt;node&lt;/code&gt; and removes it from its current position in the linked list by updating its neighbors' &lt;code&gt;prev&lt;/code&gt; and &lt;code&gt;next&lt;/code&gt; pointers. Poof, gone!&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;insertNode(node)&lt;/code&gt;: Takes a &lt;code&gt;node&lt;/code&gt; and inserts it right after our dummy &lt;code&gt;head&lt;/code&gt; node. This effectively makes it the new MRU item. "Welcome to the front row!"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;LRUCache(int capacity)&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Initialize our &lt;code&gt;cacheMap&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Create our dummy &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;tail&lt;/code&gt; nodes.&lt;/li&gt;
&lt;li&gt;  Link &lt;code&gt;head-&amp;gt;next = tail&lt;/code&gt; and &lt;code&gt;tail-&amp;gt;prev = head&lt;/code&gt;. An empty list, ready for action!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;int get(int key)&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;"Is this key even VIP enough to be in our exclusive club?"&lt;/strong&gt; Check &lt;code&gt;cacheMap&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  If &lt;code&gt;key&lt;/code&gt; isn't found (&lt;code&gt;cacheMap.find(key) == cacheMap.end()&lt;/code&gt;), return -1. "Nope, not found. Try harder next time!"&lt;/li&gt;
&lt;li&gt;  If found:

&lt;ul&gt;
&lt;li&gt;  Retrieve the &lt;code&gt;ListNode*&lt;/code&gt; using &lt;code&gt;cacheMap[key]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;"Found it! Now it's super popular, so move it to the front."&lt;/strong&gt; Call &lt;code&gt;deleteNode()&lt;/code&gt; on it to remove it from its old spot.&lt;/li&gt;
&lt;li&gt;  Call &lt;code&gt;insertNode()&lt;/code&gt; on it to place it right after the &lt;code&gt;head&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Return the &lt;code&gt;node-&amp;gt;value&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;void put(int key, int value)&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;"Does this key already have a reservation?"&lt;/strong&gt; Check &lt;code&gt;cacheMap&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  If &lt;code&gt;key&lt;/code&gt; &lt;em&gt;is&lt;/em&gt; found:

&lt;ul&gt;
&lt;li&gt;  Retrieve the &lt;code&gt;ListNode*&lt;/code&gt; from &lt;code&gt;cacheMap&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Update its &lt;code&gt;value&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;"Ah, you're back! Let's update your info and put you at the top."&lt;/strong&gt; &lt;code&gt;deleteNode()&lt;/code&gt; and &lt;code&gt;insertNode()&lt;/code&gt; to refresh its MRU status.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;  If &lt;code&gt;key&lt;/code&gt; &lt;em&gt;is not&lt;/em&gt; found:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;"New face! Welcome to the party. Let's add you."&lt;/strong&gt; Create a &lt;code&gt;new ListNode(key, value)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  Add it to &lt;code&gt;cacheMap&lt;/code&gt;: &lt;code&gt;cacheMap[key] = newNode;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;insertNode(newNode)&lt;/code&gt; to make it MRU.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;"Party's getting a bit crowded, isn't it?"&lt;/strong&gt; Check &lt;code&gt;if (cacheMap.size() &amp;gt; capacity)&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;"Time for some tough decisions. Who's the least social butterfly?"&lt;/strong&gt; The LRU node is always &lt;code&gt;tail-&amp;gt;prev&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;"Sorry, old friend, your time has come."&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;deleteNode(tail-&amp;gt;prev)&lt;/code&gt; to remove it from the list.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;cacheMap.erase(tail-&amp;gt;prev-&amp;gt;key)&lt;/code&gt; to remove it from the map.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;delete tail-&amp;gt;prev;&lt;/code&gt; to free up that memory (we're not running a charity!).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Code: The Grand Symphony of Pointers and Maps
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unordered_map&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt; // For O(1) average time complexity lookup&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="c1"&gt;// A simple structure for our doubly linked list nodes&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;ListNode&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Storing the value associated with the key&lt;/span&gt;
    &lt;span class="n"&gt;ListNode&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;ListNode&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Constructor: key, value, optional prev/next for convenience&lt;/span&gt;
    &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;next&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="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LRUCache&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;private:&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;unordered_map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cacheMap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Maps key to its node in the list&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Maximum number of items the cache can hold&lt;/span&gt;
    &lt;span class="n"&gt;ListNode&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Dummy head node for the doubly linked list&lt;/span&gt;
    &lt;span class="n"&gt;ListNode&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Dummy tail node for the doubly linked list&lt;/span&gt;

    &lt;span class="c1"&gt;// Helper to remove a node from its current position in the list&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;deleteNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// "Hasta la vista, baby!" - The node bids adieu to its neighbors.&lt;/span&gt;
        &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Helper to insert a node right after the head (making it the Most Recently Used)&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;insertNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// "Making a grand entrance!" - The node proudly claims its spot at the front.&lt;/span&gt;
        &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;LRUCache&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;capacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="c1"&gt;// Initialize dummy head and tail nodes. Their key/value don't matter.&lt;/span&gt;
        &lt;span class="c1"&gt;// They simplify logic by always having valid 'prev'/'next' for real nodes.&lt;/span&gt;
        &lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ListNode&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="p"&gt;);&lt;/span&gt; 
        &lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ListNode&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="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Link the dummy nodes to each other initially&lt;/span&gt;
        &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Destructor to prevent memory leaks, a good practice for C++&lt;/span&gt;
    &lt;span class="c1"&gt;// We allocated nodes with 'new', so we must 'delete' them.&lt;/span&gt;
    &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;LRUCache&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="nb"&gt;nullptr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;next&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="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// "Is this key even VIP enough to be in our exclusive club?"&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cacheMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;cacheMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&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="c1"&gt;// "Nope, not found. Try harder next time!"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Found it! Now it's the coolest kid on the block, move it to the front.&lt;/span&gt;
        &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cacheMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="n"&gt;deleteNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;insertNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&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;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Return the value, as requested.&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// "Does this key already have a reservation?"&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cacheMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;cacheMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// "Ah, you're back! Let's update your info and put you at the top."&lt;/span&gt;
            &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cacheMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
            &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Update the value&lt;/span&gt;
            &lt;span class="n"&gt;deleteNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;insertNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;);&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="c1"&gt;// "New face! Welcome to the party. Let's add you."&lt;/span&gt;
            &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;newNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;cacheMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;insertNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newNode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="c1"&gt;// "Party's getting a bit crowded, isn't it?"&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cacheMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;capacity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// "Time for some tough decisions. Who's the least social butterfly?"&lt;/span&gt;
                &lt;span class="c1"&gt;// The LRU node is always the one just before the dummy tail.&lt;/span&gt;
                &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;lruNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

                &lt;span class="c1"&gt;// "Sorry, old friend, your time has come." Evict!&lt;/span&gt;
                &lt;span class="n"&gt;deleteNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lruNode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Remove from linked list&lt;/span&gt;
                &lt;span class="n"&gt;cacheMap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;erase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lruNode&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Remove from map&lt;/span&gt;
                &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="n"&gt;lruNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// And finally, free up that memory!&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="p"&gt;};&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Time &amp;amp; Space Complexity Analysis
&lt;/h3&gt;

&lt;p&gt;"Alright, enough fun, let's talk numbers!"&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Time Complexity:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;LRUCache(capacity)&lt;/code&gt;: &lt;strong&gt;O(1)&lt;/strong&gt;. Just initializing a few pointers and our map. No heavy lifting.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;get(key)&lt;/code&gt;: &lt;strong&gt;O(1)&lt;/strong&gt; on average.

&lt;ul&gt;
&lt;li&gt;  Hash map lookup (&lt;code&gt;cacheMap.find&lt;/code&gt; or &lt;code&gt;[]&lt;/code&gt;) is O(1) on average.&lt;/li&gt;
&lt;li&gt;  Our &lt;code&gt;deleteNode&lt;/code&gt; and &lt;code&gt;insertNode&lt;/code&gt; helpers are pure pointer manipulation, always O(1).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;code&gt;put(key, value)&lt;/code&gt;: &lt;strong&gt;O(1)&lt;/strong&gt; on average.

&lt;ul&gt;
&lt;li&gt;  Hash map operations (lookup, insert, erase) are O(1) on average.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;deleteNode&lt;/code&gt; and &lt;code&gt;insertNode&lt;/code&gt; are O(1).&lt;/li&gt;
&lt;li&gt;  Checking capacity and evicting is also constant time.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Space Complexity:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;O(capacity)&lt;/strong&gt;.

&lt;ul&gt;
&lt;li&gt;  Our &lt;code&gt;cacheMap&lt;/code&gt; stores up to &lt;code&gt;capacity&lt;/code&gt; &lt;code&gt;key -&amp;gt; ListNode*&lt;/code&gt; pairs.&lt;/li&gt;
&lt;li&gt;  Our doubly linked list stores up to &lt;code&gt;capacity&lt;/code&gt; &lt;code&gt;ListNode&lt;/code&gt; objects (plus the two dummy nodes).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Each &lt;code&gt;ListNode&lt;/code&gt; uses constant space for &lt;code&gt;key&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt;, &lt;code&gt;prev&lt;/code&gt;, &lt;code&gt;next&lt;/code&gt;.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;"So, yes, we achieved that blazing-fast O(1) average time!"&lt;/p&gt;




&lt;h3&gt;
  
  
  Key Takeaways: The Secrets of the Cache Masters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The Power Couple:&lt;/strong&gt; When you need fast lookups &lt;em&gt;and&lt;/em&gt; ordered removals/insertions, a &lt;strong&gt;Hash Map combined with a Doubly Linked List&lt;/strong&gt; is your go-to pattern. It's like the Batman and Robin of data structures!&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Dummy Nodes are MVPs:&lt;/strong&gt; Those &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;tail&lt;/code&gt; sentinels might seem unnecessary, but they elegantly handle edge cases (empty list, single item) by ensuring &lt;code&gt;prev&lt;/code&gt; and &lt;code&gt;next&lt;/code&gt; pointers are always valid, saving you from null-pointer checks and messy conditional logic.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;C++ and Memory:&lt;/strong&gt; Don't forget that if you &lt;code&gt;new&lt;/code&gt; something, you eventually need to &lt;code&gt;delete&lt;/code&gt; it. Our destructor &lt;code&gt;~LRUCache()&lt;/code&gt; ensures we're not being a memory hoarder. In languages with garbage collection (like Java or Python), this isn't a manual step, but it's crucial for C++.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Thinking beyond simple arrays:&lt;/strong&gt; Many "move to front" or "remove least X" problems often hint at linked lists or other dynamic structures.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I hope this deep dive into the LRU Cache was as enlightening as it was entertaining! May your caches be ever efficient and your evictions swift. Happy coding!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Submission Details:&lt;/strong&gt;&lt;br&gt;
Author Account: aaradhyanegi009&lt;br&gt;
Time Published: 2026-05-18 00:48:35&lt;/p&gt;

</description>
      <category>leetcode</category>
      <category>dsa</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
