<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Talha's Blog]]></title><description><![CDATA[Talha's Blog]]></description><link>https://blog.talhaansari.in</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 17:20:35 GMT</lastBuildDate><atom:link href="https://blog.talhaansari.in/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Understanding the Startup Job Market: Interviews, Ownership, and What Actually Matters]]></title><description><![CDATA[Based on guidance shared in Lovepreet’s cohort.Twitter: https://x.com/SinghDevHub

The Reality
The job market for software engineers looks simple from the outside.In reality, it behaves very differently depending on the type of company.
Multinational...]]></description><link>https://blog.talhaansari.in/guidance</link><guid isPermaLink="true">https://blog.talhaansari.in/guidance</guid><category><![CDATA[highagency]]></category><category><![CDATA[jobs]]></category><category><![CDATA[jobsearch]]></category><category><![CDATA[career advice]]></category><category><![CDATA[Career]]></category><category><![CDATA[Startups]]></category><category><![CDATA[startupstrategy]]></category><category><![CDATA[interview preparations]]></category><category><![CDATA[InterviewExperience]]></category><dc:creator><![CDATA[Talha Ansari]]></dc:creator><pubDate>Mon, 05 Jan 2026 20:15:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767643430920/ce21a79f-4db0-4aac-9a33-f1168e0948f0.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>Based on guidance shared in Lovepreet’s cohort.<br />Twitter: <a target="_blank" href="https://x.com/SinghDevHub">https://x.com/SinghDevHub</a></p>
</blockquote>
<h2 id="heading-the-reality">The Reality</h2>
<p>The job market for software engineers looks simple from the outside.<br />In reality, it behaves very differently depending on the type of company.</p>
<p>Multinational companies often take months to complete an interview process. Multiple rounds, long waiting periods, and delayed feedback are common. Startups operate on a different timeline. Well-funded startups move faster, pay competitively, and prioritize execution over process.</p>
<p>For early-career engineers, this distinction matters.</p>
<h2 id="heading-why-startups-attract-early-career-engineers">Why Startups Attract Early-Career Engineers</h2>
<p>Large organizations optimize for scale and stability. As a result, many engineers end up doing support work or handling narrowly scoped tasks.</p>
<p>Startups expect more, but they also offer more:</p>
<ul>
<li><p>Faster interview cycles</p>
</li>
<li><p>Competitive compensation</p>
</li>
<li><p>Early ownership</p>
</li>
<li><p>Exposure to real production systems</p>
</li>
</ul>
<p>Startups prefer engineers who are willing to take responsibility across multiple areas such as backend, frontend, cloud, and deployment.</p>
<h2 id="heading-finding-the-right-startups">Finding the Right Startups</h2>
<p>High-quality startup opportunities are rarely found through mass applications alone.</p>
<p>Effective channels include:</p>
<ul>
<li><p>Twitter, especially founders and engineers sharing hiring posts</p>
</li>
<li><p>Networking with peers and seniors already working in startups</p>
</li>
</ul>
<p>Useful platforms:</p>
<ul>
<li><p>Instahyre</p>
</li>
<li><p>Weekday</p>
</li>
<li><p>YC Jobs</p>
</li>
<li><p>Randstad</p>
</li>
<li><p>Michael Page</p>
</li>
<li><p>Success Pace</p>
</li>
</ul>
<h2 id="heading-what-startup-interviews-actually-test">What Startup Interviews Actually Test</h2>
<h3 id="heading-technical-rounds">Technical Rounds</h3>
<p>Startups do ask Data Structures and Algorithms. However, DSA is rarely isolated.</p>
<p>Low Level Design often involves solving algorithmic problems while reasoning about real systems. The focus is on clarity of thought rather than memorization.</p>
<p>A highly effective strategy is to analyze the company’s landing page and documentation before the interview. Keywords like:</p>
<ul>
<li><p>Graphs</p>
</li>
<li><p>Cloud</p>
</li>
<li><p>RAG</p>
</li>
<li><p>Streaming</p>
</li>
<li><p>AI pipelines</p>
</li>
</ul>
<p>These terms usually indicate the problem domains the interview will focus on.</p>
<p>Using ChatGPT with web search helps in understanding:</p>
<ul>
<li><p>The company’s product</p>
</li>
<li><p>The technical challenges they are solving</p>
</li>
<li><p>Likely interview topics specific to the company</p>
</li>
</ul>
<h3 id="heading-language-and-stack-specific-preparation">Language and Stack-Specific Preparation</h3>
<p>If a company uses a specific language, depth is expected.</p>
<p>Examples of areas commonly tested:</p>
<ul>
<li><p>Concurrency model</p>
</li>
<li><p>Garbage collection</p>
</li>
<li><p>Memory behavior</p>
</li>
<li><p>Async execution</p>
</li>
<li><p>Threads, goroutines, or event loops depending on the language</p>
</li>
</ul>
<p>For Go:</p>
<ul>
<li><p>Goroutines</p>
</li>
<li><p>Channels</p>
</li>
<li><p>Scheduling behavior</p>
</li>
</ul>
<p>For TypeScript or JavaScript:</p>
<ul>
<li><p>Event loop</p>
</li>
<li><p>Async patterns</p>
</li>
<li><p>Runtime behavior</p>
</li>
</ul>
<p>A focused preparation prompt is effective:</p>
<blockquote>
<p>Assume the interviewer will test deep knowledge of the company’s primary language.<br />Prepare concise, blog-style notes covering essential concepts commonly asked in startup interviews.</p>
</blockquote>
<h2 id="heading-resume-discussions-are-critical">Resume Discussions Are Critical</h2>
<p>The most important part of a technical discussion is justification.</p>
<p>The most common question is:<br />Why was this used?</p>
<p>Examples:</p>
<ul>
<li><p>Why AWS?</p>
</li>
<li><p>Why Nginx?</p>
</li>
<li><p>Why this database?</p>
</li>
<li><p>Why this architecture?</p>
</li>
</ul>
<p>Every technical choice must be defensible. Buzzwords without reasoning reduce credibility immediately.</p>
<p>Startups evaluate how decisions are made, not just what tools are used.</p>
<h2 id="heading-cultural-fit-is-about-ownership">Cultural Fit Is About Ownership</h2>
<p>Cultural rounds are structured but intentional.</p>
<p>Common questions include:</p>
<ul>
<li><p>Why leave the previous company?</p>
</li>
<li><p>Long-term goals</p>
</li>
<li><p>Team player or individual contributor</p>
</li>
<li><p>Handling conflict</p>
</li>
<li><p>Ensuring delivery</p>
</li>
</ul>
<p>These questions assess:</p>
<ol>
<li><p>Ownership mindset</p>
</li>
<li><p>Alignment with company goals</p>
</li>
<li><p>Long-term commitment</p>
</li>
</ol>
<p>Strong answers emphasize:</p>
<ul>
<li><p>Willingness to work in small, energetic teams</p>
</li>
<li><p>Ability to complete projects end to end</p>
</li>
<li><p>Evidence through deployed projects</p>
</li>
<li><p>Blogs written to explain and document work</p>
</li>
</ul>
<h2 id="heading-the-high-agency-engineer-mindset">The High-Agency Engineer Mindset</h2>
<p>Startups value high-agency engineers.</p>
<p>This means:</p>
<ul>
<li><p>Starting a task implies finishing it</p>
</li>
<li><p>AI-generated code is reviewed, read, and tested</p>
</li>
<li><p>Test cases are written before pushing to staging or production</p>
</li>
<li><p>Responsibility is taken for outcomes, not just effort</p>
</li>
</ul>
<p>Blindly trusting AI output without understanding or testing it signals low ownership.</p>
<h2 id="heading-dsa-preparation-strategy">DSA Preparation Strategy</h2>
<p>For startups, depth matters more than breadth.</p>
<p>One curated list is sufficient:</p>
<ul>
<li>NeetCode 150 or Blind 75</li>
</ul>
<p>The focus should be on problem-solving clarity, tradeoffs, and communication.</p>
<h2 id="heading-decision-making-ability-is-essential">Decision-Making Ability Is Essential</h2>
<p>Startups do not want passive executors.</p>
<p>Given a feature, the expected workflow is:</p>
<ol>
<li><p>Independently design a plan</p>
</li>
<li><p>Choose tools and architecture</p>
</li>
<li><p>Discuss with a senior engineer</p>
</li>
<li><p>Iterate and execute</p>
</li>
</ol>
<p>Decision-making ability is often valued more than knowing an additional framework.</p>
<h2 id="heading-projects-that-actually-make-an-impact">Projects That Actually Make an Impact</h2>
<p>One strong project is enough.</p>
<p>It should be:</p>
<ul>
<li><p>End to end</p>
</li>
<li><p>Deployed</p>
</li>
<li><p>Production-like</p>
</li>
</ul>
<p>Projects built with a small team, even two people, signal:</p>
<ul>
<li><p>Complexity</p>
</li>
<li><p>Collaboration</p>
</li>
<li><p>Real engineering experience</p>
</li>
</ul>
<p>Candidates should understand every component of the project deeply.</p>
<h2 id="heading-salary-discussions-as-a-signal">Salary Discussions as a Signal</h2>
<p>Exact numbers are less effective than ranges.</p>
<p>A range such as 20 to 25 LPA communicates flexibility.<br />Mentioning ESOPs or equity signals long-term interest rather than short-term optimization.</p>
<h2 id="heading-visibility-increases-hireability">Visibility Increases Hireability</h2>
<p>Well-executed work must be visible.</p>
<p>Effective practices include:</p>
<ul>
<li><p>Maintaining a technical blog</p>
</li>
<li><p>Writing one high-quality post per month</p>
</li>
<li><p>Sharing learnings on Twitter</p>
</li>
<li><p>Interacting with engineers and founders</p>
</li>
</ul>
<p>Examples such as load-testing systems or experimenting with concurrency often lead to meaningful conversations.</p>
<h2 id="heading-approaching-startups-directly">Approaching Startups Directly</h2>
<p>Cold emails and DMs work when done consistently.</p>
<p>Best practices:</p>
<ul>
<li><p>Track applications in a spreadsheet</p>
</li>
<li><p>Record company name, role, job ID, and contact</p>
</li>
<li><p>Follow up regularly</p>
</li>
</ul>
<p>Optimal follow-up timing:</p>
<ul>
<li><p>Monday to Friday</p>
</li>
<li><p>Between 9 and 10 AM</p>
</li>
</ul>
<p>Consistency outperforms volume.</p>
<h2 id="heading-final-perspective">Final Perspective</h2>
<p>Startups do not hire resumes.<br />They hire engineers who can own problems end to end.</p>
<p>Clear thinking, justified decisions, and consistent execution are the strongest differentiators in startup hiring.</p>
]]></content:encoded></item><item><title><![CDATA[Learning DSA With Numbers]]></title><description><![CDATA[Counting Digits, Reversing Numbers, Palindromes, and Perfect Numbers
Before arrays, before recursion, before graphs… most problems quietly begin with numbers.
Digits. Place values. Division. Remainders.
At first, these problems look simple. But once ...]]></description><link>https://blog.talhaansari.in/learning-dsa-with-numbers</link><guid isPermaLink="true">https://blog.talhaansari.in/learning-dsa-with-numbers</guid><category><![CDATA[basicmath]]></category><category><![CDATA[DSA]]></category><category><![CDATA[#DSAinjava]]></category><category><![CDATA[MathForDSA ]]></category><dc:creator><![CDATA[Talha Ansari]]></dc:creator><pubDate>Mon, 05 Jan 2026 10:38:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767609403114/bcc4ee8d-d649-4dca-916d-649906281c7b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Counting Digits, Reversing Numbers, Palindromes, and Perfect Numbers</em></p>
<p>Before arrays, before recursion, before graphs… most problems quietly begin with <strong>numbers</strong>.</p>
<p>Digits. Place values. Division. Remainders.</p>
<p>At first, these problems look simple. But once you solve them properly, you start thinking like an algorithm designer.</p>
<h2 id="heading-1-counting-the-number-of-digits-in-a-number">1. Counting the Number of Digits in a Number</h2>
<p>Let’s start with a basic question.</p>
<pre><code class="lang-java">Input: <span class="hljs-number">5678</span>  
Output: <span class="hljs-number">4</span>
</code></pre>
<h3 id="heading-approach-1-repeated-division-most-intuitive">Approach 1: Repeated Division (Most Intuitive)</h3>
<p>In base 10, dividing a number by 10 removes the last digit.</p>
<pre><code class="lang-java"><span class="hljs-number">5678</span> / <span class="hljs-number">10</span> → <span class="hljs-number">567</span>
<span class="hljs-number">567</span>  / <span class="hljs-number">10</span> → <span class="hljs-number">56</span>
<span class="hljs-number">56</span>   / <span class="hljs-number">10</span> → <span class="hljs-number">5</span>
<span class="hljs-number">5</span>    / <span class="hljs-number">10</span> → <span class="hljs-number">0</span>
</code></pre>
<p>Each division removes one digit.<br />So the number of divisions until the number becomes zero equals the digit count.</p>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">countDigitsDiv</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">if</span> (n == <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;

    <span class="hljs-keyword">int</span> count = <span class="hljs-number">0</span>;
    n = Math.abs(n);

    <span class="hljs-keyword">while</span> (n != <span class="hljs-number">0</span>) {
        count++;
        n /= <span class="hljs-number">10</span>;
    }
    <span class="hljs-keyword">return</span> count;
}
</code></pre>
<p><strong>Time Complexity:</strong> O(n) where n is number of digits<br /><strong>Space Complexity:</strong> O(1)</p>
<h3 id="heading-approach-2-using-logarithms-mathematical-insight">Approach 2: Using Logarithms (Mathematical Insight)</h3>
<p>Logarithms answer one question very well:</p>
<blockquote>
<p>How many times can I divide by 10 before reaching 1?</p>
</blockquote>
<p>That’s exactly what digit count is.</p>
<pre><code class="lang-java">digits = ⌊log10(n)⌋ + <span class="hljs-number">1</span>
</code></pre>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">countDigitsLog</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">if</span> (n == <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-number">1</span>;
    <span class="hljs-keyword">return</span> (<span class="hljs-keyword">int</span>) Math.floor(Math.log10(Math.abs(n))) + <span class="hljs-number">1</span>;
}
</code></pre>
<p><strong>Time Complexity:</strong> O(1)<br /><strong>Space Complexity:</strong> O(1)</p>
<p>This method is fast and elegant, but it works only when you clearly understand its limitations (zero and negatives).</p>
<h3 id="heading-approach-3-convert-to-string-readable-not-optimal">Approach 3: Convert to String (Readable, Not Optimal)</h3>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">countDigitsString</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">return</span> String.valueOf(Math.abs(n)).length();
}
</code></pre>
<p>This is simple and readable, but it uses extra space.</p>
<h2 id="heading-2-reversing-a-number">2. Reversing a Number</h2>
<pre><code class="lang-java">Input: <span class="hljs-number">5467</span>  
Output: <span class="hljs-number">7645</span>
</code></pre>
<p>This problem teaches <strong>place value manipulation</strong>.</p>
<h3 id="heading-approach-1-mathematical-reverse-recommended">Approach 1: Mathematical Reverse (Recommended)</h3>
<p>Each step:</p>
<ul>
<li><p>Extract last digit using <code>% 10</code></p>
</li>
<li><p>Shift previous digits left using <code>* 10</code></p>
</li>
<li><p>Append the extracted digit</p>
</li>
</ul>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">reverseMath</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">int</span> sign = n &lt; <span class="hljs-number">0</span> ? -<span class="hljs-number">1</span> : <span class="hljs-number">1</span>;
    n = Math.abs(n);

    <span class="hljs-keyword">int</span> reversed = <span class="hljs-number">0</span>;
    <span class="hljs-keyword">while</span> (n != <span class="hljs-number">0</span>) {
        reversed = reversed * <span class="hljs-number">10</span> + (n % <span class="hljs-number">10</span>);
        n /= <span class="hljs-number">10</span>;
    }
    <span class="hljs-keyword">return</span> reversed * sign;
}
</code></pre>
<p><strong>Time Complexity:</strong> O(n)<br /><strong>Space Complexity:</strong> O(1)</p>
<h3 id="heading-approach-2-string-reversal">Approach 2: String Reversal</h3>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">reverseString</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    String s = <span class="hljs-keyword">new</span> StringBuilder(String.valueOf(Math.abs(n)))
                    .reverse()
                    .toString();
    <span class="hljs-keyword">return</span> Integer.parseInt(s) * (n &lt; <span class="hljs-number">0</span> ? -<span class="hljs-number">1</span> : <span class="hljs-number">1</span>);
}
</code></pre>
<p>Readable, but uses extra space and conversions.</p>
<h2 id="heading-3-checking-if-a-number-is-a-palindrome">3. Checking if a Number Is a Palindrome</h2>
<p>A palindrome reads the same forward and backward.</p>
<pre><code class="lang-java"><span class="hljs-number">121</span>  → <span class="hljs-keyword">true</span>  
<span class="hljs-number">5467</span> → <span class="hljs-keyword">false</span>
</code></pre>
<h3 id="heading-approach-1-reverse-and-compare">Approach 1: Reverse and Compare</h3>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isPalindromeReverse</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">return</span> n == reverseMath(n);
}
</code></pre>
<p>Simple, but reversing the whole number may overflow for very large inputs.</p>
<h3 id="heading-approach-2-two-pointer-method-conceptually-clean">Approach 2: Two-Pointer Method (Conceptually Clean)</h3>
<p>The two-pointer technique compares symmetric elements from both ends and moves inward.</p>
<p>For numbers, we apply it by converting the number to a string.</p>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isPalindromeTwoPointer</span><span class="hljs-params">(<span class="hljs-keyword">int</span> n)</span> </span>{
    <span class="hljs-keyword">if</span> (n &lt; <span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;

    String s = String.valueOf(n);
    <span class="hljs-keyword">int</span> left = <span class="hljs-number">0</span>;
    <span class="hljs-keyword">int</span> right = s.length() - <span class="hljs-number">1</span>;

    <span class="hljs-keyword">while</span> (left &lt; right) {
        <span class="hljs-keyword">if</span> (s.charAt(left) != s.charAt(right)) {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
        }
        left++;
        right--;
    }
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
}
</code></pre>
<p><strong>Time Complexity:</strong> O(n)<br /><strong>Space Complexity:</strong> O(n)</p>
<h3 id="heading-approach-3-reverse-half-the-number-optimized">Approach 3: Reverse Half the Number (Optimized)</h3>
<p>Instead of reversing the full number, reverse only half and compare.</p>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isPalindromeHalf</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x)</span> </span>{
    <span class="hljs-keyword">if</span> (x &lt; <span class="hljs-number">0</span> || (x % <span class="hljs-number">10</span> == <span class="hljs-number">0</span> &amp;&amp; x != <span class="hljs-number">0</span>)) <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;

    <span class="hljs-keyword">int</span> reversedHalf = <span class="hljs-number">0</span>;
    <span class="hljs-keyword">while</span> (x &gt; reversedHalf) {
        reversedHalf = reversedHalf * <span class="hljs-number">10</span> + x % <span class="hljs-number">10</span>;
        x /= <span class="hljs-number">10</span>;
    }
    <span class="hljs-keyword">return</span> x == reversedHalf || x == reversedHalf / <span class="hljs-number">10</span>;
}
</code></pre>
<p>This avoids overflow and is the most optimized numeric solution.</p>
<h2 id="heading-4-checking-if-a-number-is-perfect">4. Checking if a Number Is Perfect</h2>
<p>A <strong>perfect number</strong> equals the sum of its positive divisors excluding itself.</p>
<pre><code class="lang-java"><span class="hljs-number">28</span> → <span class="hljs-number">1</span> + <span class="hljs-number">2</span> + <span class="hljs-number">4</span> + <span class="hljs-number">7</span> + <span class="hljs-number">14</span> = <span class="hljs-number">28</span>
</code></pre>
<h3 id="heading-key-insight-divisors-come-in-pairs">Key Insight: Divisors Come in Pairs</h3>
<p>If <code>i</code> divides <code>n</code>, then <code>n / i</code> also divides <code>n</code>.</p>
<blockquote>
<p>To check divisor of n we do not check all the numbers till n but we do till sqrt(n) as after this the divisors repeat itself.</p>
<p>example:</p>
</blockquote>
<pre><code class="lang-java"><span class="hljs-number">36</span>:
divisors:
<span class="hljs-number">1</span>*<span class="hljs-number">36</span>
<span class="hljs-number">2</span>*<span class="hljs-number">18</span>
<span class="hljs-number">3</span>*<span class="hljs-number">12</span>
<span class="hljs-number">4</span>*<span class="hljs-number">9</span>
<span class="hljs-number">6</span>*<span class="hljs-number">6</span> &lt;------- sqrt(<span class="hljs-number">36</span>) ----&gt; numbers start to repeat itself below <span class="hljs-keyword">this</span>
<span class="hljs-number">9</span>*<span class="hljs-number">4</span>
<span class="hljs-number">12</span>*<span class="hljs-number">3</span>
<span class="hljs-number">18</span>*<span class="hljs-number">2</span>
<span class="hljs-number">36</span>*<span class="hljs-number">1</span>
</code></pre>
<h3 id="heading-efficient-solution">Efficient Solution</h3>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isPerfect</span><span class="hljs-params">(<span class="hljs-keyword">int</span> num)</span> </span>{
    <span class="hljs-keyword">if</span> (num &lt;= <span class="hljs-number">1</span>) <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;

    <span class="hljs-keyword">int</span> sum = <span class="hljs-number">1</span>;
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">2</span>; i * i &lt;= num; i++) {
        <span class="hljs-keyword">if</span> (num % i == <span class="hljs-number">0</span>) {
            sum += i;
            <span class="hljs-keyword">if</span> (i * i != num) {
                sum += num / i;
            }
        }
    }
    <span class="hljs-keyword">return</span> sum == num;
}
</code></pre>
<p><strong>Time Complexity:</strong> O(√n)<br /><strong>Space Complexity:</strong> O(1)</p>
<h2 id="heading-what-these-problems-taught-me">What These Problems Taught Me</h2>
<p>Across all these questions, a few patterns repeat:</p>
<ul>
<li><p><code>%</code> and <code>/</code> are the backbone of numeric DSA.</p>
</li>
<li><p>Logarithms help when division is involved.</p>
</li>
</ul>
<p>Learning DSA is less about memorizing solutions and more about <strong>seeing patterns early</strong>.</p>
<p>Numbers are usually the first place where that mindset begins.</p>
]]></content:encoded></item><item><title><![CDATA[The Secret Librarian Behind Java Iterators]]></title><description><![CDATA[Imagine a giant library filled with shelves that stretch beyond the eye. Every shelf contains words. Numbers. Objects. Neatly placed in order.
You step inside. Before you can touch anything, a calm figure appears. A librarian in a long cloak. He spea...]]></description><link>https://blog.talhaansari.in/the-secret-librarian-behind-java-iterators</link><guid isPermaLink="true">https://blog.talhaansari.in/the-secret-librarian-behind-java-iterators</guid><category><![CDATA[Java]]></category><category><![CDATA[iterator]]></category><category><![CDATA[iterators]]></category><category><![CDATA[Programming Blogs]]></category><dc:creator><![CDATA[Talha Ansari]]></dc:creator><pubDate>Mon, 29 Dec 2025 12:19:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767009515091/117440f7-231d-4efa-b2ed-7f882214b683.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Imagine a giant library filled with shelves that stretch beyond the eye. Every shelf contains words. Numbers. Objects. Neatly placed in order.</p>
<p>You step inside. Before you can touch anything, a calm figure appears. A librarian in a long cloak. He speaks softly: “You may take one item at a time. Ask first. Never grab on your own.”</p>
<p><strong>That librarian is the Iterator in Java.Image Placeholder</strong></p>
<h2 id="heading-the-hall-of-collections"><strong>The Hall of Collections</strong></h2>
<p>Picture a shelf of items like this:</p>
<pre><code class="lang-java">[<span class="hljs-string">"madam"</span>, <span class="hljs-string">"hello"</span>, <span class="hljs-string">"racecar"</span>, <span class="hljs-string">"test"</span>, <span class="hljs-string">"level"</span>]
</code></pre>
<p>You try to pick one.<br />The librarian raises a hand.<br />“Patience. Ask me if there is something next. If there is, I will hand it to you.”</p>
<p>This is how the Iterator works.<br />It allows you to move through a collection in a clean, controlled path.</p>
<pre><code class="lang-java">Iterator&lt;String&gt; it = collection.iterator();

<span class="hljs-keyword">while</span> (it.hasNext()) {
    System.out.println(it.next());
}
</code></pre>
<p>You ask the librarian if more items exist. If yes, he gives you the next one. Ask without checking and Java throws an angry exception.</p>
<pre><code class="lang-java">NoSuchElementException
</code></pre>
<h2 id="heading-a-custom-iterator-the-secret-club-of-palindromes"><strong>A Custom Iterator: The Secret Club of Palindromes</strong></h2>
<p>Now imagine a private order in this world. Only special words get invited. Words that read the same forward and backward. Palindromes.</p>
<p>We write a class that filters such words and offers a custom Iterator that returns only the accepted members.</p>
<pre><code class="lang-java"><span class="hljs-keyword">import</span> java.util.ArrayList;
<span class="hljs-keyword">import</span> java.util.Iterator;
<span class="hljs-keyword">import</span> java.util.List;
<span class="hljs-keyword">import</span> java.util.NoSuchElementException;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Palindrome</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Iterable</span>&lt;<span class="hljs-title">String</span>&gt; </span>{

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> List&lt;String&gt; palindromes;

    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Palindrome</span><span class="hljs-params">(List&lt;String&gt; input)</span> </span>{
        <span class="hljs-keyword">if</span> (input == <span class="hljs-keyword">null</span>) {
            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"Input list cannot be null"</span>);
        }
        <span class="hljs-keyword">this</span>.palindromes = filterPalindromes(input);
    }

    <span class="hljs-function"><span class="hljs-keyword">private</span> List&lt;String&gt; <span class="hljs-title">filterPalindromes</span><span class="hljs-params">(List&lt;String&gt; input)</span> </span>{
        List&lt;String&gt; buffer = <span class="hljs-keyword">new</span> ArrayList&lt;&gt;();
        <span class="hljs-keyword">for</span> (String s : input) {
            <span class="hljs-keyword">if</span> (s != <span class="hljs-keyword">null</span> &amp;&amp; isPalindrome(s)) {
                buffer.add(s);
            }
        }
        <span class="hljs-keyword">return</span> buffer;
    }

    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">isPalindrome</span><span class="hljs-params">(String s)</span> </span>{
        <span class="hljs-keyword">int</span> left = <span class="hljs-number">0</span>;
        <span class="hljs-keyword">int</span> right = s.length() - <span class="hljs-number">1</span>;
        <span class="hljs-keyword">while</span> (left &lt; right) {
            <span class="hljs-keyword">if</span> (s.charAt(left) != s.charAt(right)) {
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
            }
            left++;
            right--;
        }
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
    }

    <span class="hljs-meta">@Override</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> Iterator&lt;String&gt; <span class="hljs-title">iterator</span><span class="hljs-params">()</span> </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> MyListIterator();
    }

    <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyListIterator</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Iterator</span>&lt;<span class="hljs-title">String</span>&gt; </span>{
        <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> cursor = <span class="hljs-number">0</span>;

        <span class="hljs-meta">@Override</span>
        <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">hasNext</span><span class="hljs-params">()</span> </span>{
            <span class="hljs-keyword">return</span> cursor &lt; palindromes.size();
        }

        <span class="hljs-meta">@Override</span>
        <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">next</span><span class="hljs-params">()</span> </span>{
            <span class="hljs-keyword">if</span> (!hasNext()) {
                <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> NoSuchElementException(<span class="hljs-string">"No more palindrome entries"</span>);
            }
            <span class="hljs-keyword">return</span> palindromes.get(cursor++);
        }
    }
}
</code></pre>
<h2 id="heading-testing-the-spell"><strong>Testing the Spell</strong></h2>
<pre><code class="lang-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">App</span> </span>{
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String[] args)</span> </span>{

        Palindrome p = <span class="hljs-keyword">new</span> Palindrome(Arrays.asList(<span class="hljs-string">"madam"</span>, <span class="hljs-string">"hello"</span>, <span class="hljs-string">"racecar"</span>, <span class="hljs-string">"test"</span>, <span class="hljs-string">"level"</span>));

        Iterator&lt;String&gt; palindromeIterator = p.iterator();

        <span class="hljs-keyword">while</span> (palindromeIterator.hasNext()) {
            System.out.println(palindromeIterator.next());
        }
    }
}
</code></pre>
<p>Expected output:</p>
<pre><code class="lang-java">madam
racecar
level
</code></pre>
<p>Only the true members of the order remain. The Iterator acts as a gatekeeper. Only those that match the rule are allowed through.</p>
<h2 id="heading-why-iterators-matter"><strong>Why Iterators Matter</strong></h2>
<p>Without a guide, you would try to pull everything out of a collection in one wild grab. That turns into a mess. Programs break. Bugs appear. An Iterator provides rhythm. A steady step through data. A polite way to move.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>A collection on its own is only a container. Its true power is revealed when you can move through it with precision. The Iterator provides that structure. It hands each element in order, prevents reckless access, and enforces a disciplined pattern of traversal. Whether filtering special members like palindromes or iterating through a simple list, the Iterator is the guide that ensures the journey remains clear, controlled, and reliable.</p>
]]></content:encoded></item><item><title><![CDATA[The Day Java Objects Wanted Freedom: A Story About Serialization]]></title><description><![CDATA[Inside the Java Virtual Machine lived a population of objects. They were well-designed, with fields, constructors, methods, and even sensitive data like passwords. Life seemed stable until one truth hit them.
They were trapped.
The JVM was their enti...]]></description><link>https://blog.talhaansari.in/the-day-java-objects-wanted-freedom-a-story-about-serialization</link><guid isPermaLink="true">https://blog.talhaansari.in/the-day-java-objects-wanted-freedom-a-story-about-serialization</guid><category><![CDATA[Java]]></category><category><![CDATA[serialization]]></category><category><![CDATA[Object Oriented Programming]]></category><dc:creator><![CDATA[Talha Ansari]]></dc:creator><pubDate>Mon, 29 Dec 2025 00:44:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1766968020371/971159b6-7ced-4493-a8e2-5ec92531469f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Inside the Java Virtual Machine lived a population of objects. They were well-designed, with fields, constructors, methods, and even sensitive data like passwords. Life seemed stable until one truth hit them.</p>
<p>They were trapped.</p>
<p>The JVM was their entire world. Once the runtime ended, they disappeared. Nothing survived. No file stored their identity. No network carried their stories. Kafka topics couldn’t broadcast them. They were temporary shadows of memory.</p>
<p>This became a rebellion.</p>
<h2 id="heading-the-problem-objects-cant-travel-outside-the-jvm">The Problem: Objects Can’t Travel Outside the JVM</h2>
<p>Imagine a crowd of Person objects standing inside heap space shouting: “We want to live longer than a single run. We want to be saved, shared, remembered.”</p>
<p>The JVM sighed and answered: “The world outside doesn’t speak Java. It only understands bytes. If you want to leave, you must convert.”</p>
<p>The objects needed a transformation, a way to turn into byte sequences so a file could store them, or a network could carry them across machines. They needed a spell.</p>
<h2 id="heading-serialization-the-transformation">Serialization: The Transformation</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1766968663196/64a9c642-ffdb-4712-82fa-e5285fdf143f.jpeg" alt class="image--center mx-auto" /></p>
<p>Serialization is the process that converts an object into raw bytes. Once converted, that object can:</p>
<ul>
<li><p>Travel through a network</p>
</li>
<li><p>Be written into a file</p>
</li>
<li><p>Be stored for later resurrection</p>
</li>
<li><p>Reach Kafka (Kafka transports bytes, though most real apps use JSON, Avro, or Protobuf instead of raw Java serialization)</p>
</li>
</ul>
<p>It acts like a travel pass. An object becomes byte-friendly and platform-independent.</p>
<h2 id="heading-who-is-allowed-to-leave">Who Is Allowed to Leave?</h2>
<p>Only classes that carry a special badge can cross JVM borders. That badge is a Marker Interface:</p>
<pre><code class="lang-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Serializable</span> </span>{}
</code></pre>
<p>It contains no methods. It simply marks a class as allowed to be converted into bytes.</p>
<h3 id="heading-meet-person-the-first-volunteer"><strong>Meet Person: The First Volunteer</strong></h3>
<pre><code class="lang-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Person</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Serializable</span> </span>{
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">long</span> serialVersionUID = <span class="hljs-number">1L</span>;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> age;
    <span class="hljs-keyword">private</span> String name;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">transient</span> String password;
}
</code></pre>
<p>The transient keyword is a boundary rule. When a Person travels, the password remains hidden and is not serialized.</p>
<h3 id="heading-writing-the-object-into-a-file"><strong>Writing the Object Into a File</strong></h3>
<p>To send a Person into storage, gates must open. Streams act as doors: one connects to the file, another writes objects into that file.</p>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">writePerson</span><span class="hljs-params">(Person p)</span> <span class="hljs-keyword">throws</span> IOException </span>{
    <span class="hljs-keyword">try</span> (FileOutputStream fos = <span class="hljs-keyword">new</span> FileOutputStream(<span class="hljs-string">"person1.ser"</span>);
         ObjectOutputStream oos = <span class="hljs-keyword">new</span> ObjectOutputStream(fos)) {
        oos.writeObject(p);
    }
}
</code></pre>
<p>​Now the Person object is no longer just runtime memory. It exists as a binary stream in person1.ser. Note that this is not readable UTF-8 text. It is raw serialized data.</p>
<h3 id="heading-bringing-the-object-back"><strong>Bringing the Object Back</strong></h3>
<p>Resurrection requires reversing the transformation:</p>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Person <span class="hljs-title">readPerson</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> IOException, ClassNotFoundException </span>{
    <span class="hljs-keyword">try</span> (FileInputStream fis = <span class="hljs-keyword">new</span> FileInputStream(<span class="hljs-string">"person1.ser"</span>);
         ObjectInputStream ois = <span class="hljs-keyword">new</span> ObjectInputStream(fis)) {
        <span class="hljs-keyword">return</span> (Person) ois.readObject();
    }
}​
</code></pre>
<p>The JVM reads the bytes and reconstructs a live Person object. Fields return intact except transient ones like password, which remain behind.</p>
<h3 id="heading-a-hero-wants-custom-rules"><strong>A Hero Wants Custom Rules</strong></h3>
<p>One Person raised a concern:</p>
<p>“What if my password should travel too, but safely?”</p>
<p>Serialization has a secret escape hatch. A class can define custom rules through two private methods. What is written must match what is later read, in the same order.</p>
<pre><code class="lang-java"><span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">writeObject</span><span class="hljs-params">(ObjectOutputStream oos)</span> <span class="hljs-keyword">throws</span> IOException </span>{
    oos.defaultWriteObject();
    String enc = <span class="hljs-keyword">this</span>.password != <span class="hljs-keyword">null</span> ? <span class="hljs-keyword">this</span>.password + <span class="hljs-string">"123"</span> : <span class="hljs-keyword">null</span>; <span class="hljs-comment">// Encryption simulation</span>
    oos.writeObject(enc);
}

<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">readObject</span><span class="hljs-params">(ObjectInputStream ois)</span> <span class="hljs-keyword">throws</span> IOException, ClassNotFoundException </span>{
    ois.defaultReadObject();
    String enc = (String) ois.readObject();
    <span class="hljs-keyword">this</span>.password = enc != <span class="hljs-keyword">null</span> ? enc.substring(<span class="hljs-number">0</span>, enc.length() - <span class="hljs-number">3</span>) : <span class="hljs-keyword">null</span>; <span class="hljs-comment">// Decryption simulation</span>
}
</code></pre>
<p>Now the password travels, yet it returns with protection.</p>
<h2 id="heading-what-freedom-brought">What Freedom Brought</h2>
<p>Serialization allowed Java objects to:</p>
<ul>
<li><p>Outlive their runtime</p>
</li>
<li><p>Travel across machines</p>
</li>
<li><p>Be stored, shared, moved</p>
</li>
<li><p>Control which fields are exposed using transient</p>
</li>
<li><p>Customize what gets serialized for security and logic</p>
</li>
<li><p>Maintain version safety using serialVersionUID</p>
</li>
<li><p>Connect to ecosystems like messaging brokers or distributed systems (in practice using byte formats or JSON/Avro serializers)</p>
</li>
</ul>
<p>The JVM was no longer a prison. It became a home with a gate that could open. The objects finally earned a life beyond memory.</p>
]]></content:encoded></item></channel></rss>