@@ -24597,18 +24597,18 @@
2459724597 <ul class="md-nav__list">
2459824598
2459924599 <li class="md-nav__item">
24600- <a href="#solution-1" class="md-nav__link">
24600+ <a href="#solution-1-recursion " class="md-nav__link">
2460124601 <span class="md-ellipsis">
24602- Solution 1
24602+ Solution 1: Recursion
2460324603 </span>
2460424604 </a>
2460524605
2460624606</li>
2460724607
2460824608 <li class="md-nav__item">
24609- <a href="#solution-2" class="md-nav__link">
24609+ <a href="#solution-2-bit-manipulation-brain-teaser " class="md-nav__link">
2461024610 <span class="md-ellipsis">
24611- Solution 2
24611+ Solution 2: Bit Manipulation + Brain Teaser
2461224612 </span>
2461324613 </a>
2461424614
@@ -86519,7 +86519,7 @@ <h2 id="description">Description</h2>
8651986519<pre>
8652086520<strong>Input:</strong> n = 2, k = 1
8652186521<strong>Output:</strong> 0
86522- <strong>Explanation:</strong>
86522+ <strong>Explanation:</strong>
8652386523row 1: 0
8652486524row 2: <u>0</u>1
8652586525</pre>
@@ -86529,7 +86529,7 @@ <h2 id="description">Description</h2>
8652986529<pre>
8653086530<strong>Input:</strong> n = 2, k = 2
8653186531<strong>Output:</strong> 1
86532- <strong>Explanation:</strong>
86532+ <strong>Explanation:</strong>
8653386533row 1: 0
8653486534row 2: 0<u>1</u>
8653586535</pre>
@@ -86547,8 +86547,20 @@ <h2 id="description">Description</h2>
8654786547<h2 id="solutions">Solutions</h2>
8654886548<!-- solution:start -->
8654986549
86550- <h3 id="solution-1">Solution 1</h3>
86551- <div class="tabbed-set tabbed-alternate" data-tabs="1:4"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Python3</label><label for="__tabbed_1_2">Java</label><label for="__tabbed_1_3">C++</label><label for="__tabbed_1_4">Go</label></div>
86550+ <h3 id="solution-1-recursion">Solution 1: Recursion</h3>
86551+ <p>Let's first observe the pattern of the first few rows:</p>
86552+ <div class="highlight"><pre><span></span><code>n = 1: 0
86553+ n = 2: 0 1
86554+ n = 3: 0 1 1 0
86555+ n = 4: 0 1 1 0 1 0 0 1
86556+ n = 5: 0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0
86557+ ...
86558+ </code></pre></div>
86559+ <p>We can see that the first half of each row is exactly the same as the previous row, and the second half is the inversion of the previous row. Note that "inversion" here means changing <span class="arithmatex">\(0\)</span> to <span class="arithmatex">\(1\)</span> and <span class="arithmatex">\(1\)</span> to <span class="arithmatex">\(0\)</span>.</p>
86560+ <p>If <span class="arithmatex">\(k\)</span> is in the first half, then the <span class="arithmatex">\(k\)</span>-th character is the same as the <span class="arithmatex">\(k\)</span>-th character of the previous row, so we can directly recurse with <span class="arithmatex">\(kthGrammar(n - 1, k)\)</span>.</p>
86561+ <p>If <span class="arithmatex">\(k\)</span> is in the second half, then the <span class="arithmatex">\(k\)</span>-th character is the inversion of the <span class="arithmatex">\((k - 2^{n - 2})\)</span>-th character of the previous row, i.e., <span class="arithmatex">\(kthGrammar(n - 1, k - 2^{n - 2}) \oplus 1\)</span>.</p>
86562+ <p>The time complexity is <span class="arithmatex">\(O(n)\)</span>, and the space complexity is <span class="arithmatex">\(O(n)\)</span>.</p>
86563+ <div class="tabbed-set tabbed-alternate" data-tabs="1:5"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Python3</label><label for="__tabbed_1_2">Java</label><label for="__tabbed_1_3">C++</label><label for="__tabbed_1_4">Go</label><label for="__tabbed_1_5">TypeScript</label></div>
8655286564<div class="tabbed-content">
8655386565<div class="tabbed-block">
8655486566<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
@@ -86628,14 +86640,50 @@ <h3 id="solution-1">Solution 1</h3>
8662886640<span class="p">}</span>
8662986641</code></pre></div></td></tr></table></div>
8663086642</div>
86643+ <div class="tabbed-block">
86644+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
86645+ <span class="normal">2</span>
86646+ <span class="normal">3</span>
86647+ <span class="normal">4</span>
86648+ <span class="normal">5</span>
86649+ <span class="normal">6</span>
86650+ <span class="normal">7</span>
86651+ <span class="normal">8</span>
86652+ <span class="normal">9</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="kd">function</span><span class="w"> </span><span class="nx">kthGrammar</span><span class="p">(</span><span class="nx">n</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">,</span><span class="w"> </span><span class="nx">k</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="w"> </span><span class="p">{</span>
86653+ <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">n</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mf">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
86654+ <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span>
86655+ <span class="w"> </span><span class="p">}</span>
86656+ <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">k</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="mf">1</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="p">(</span><span class="nx">n</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mf">2</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
86657+ <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">kthGrammar</span><span class="p">(</span><span class="nx">n</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mf">1</span><span class="p">,</span><span class="w"> </span><span class="nx">k</span><span class="p">);</span>
86658+ <span class="w"> </span><span class="p">}</span>
86659+ <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">kthGrammar</span><span class="p">(</span><span class="nx">n</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mf">1</span><span class="p">,</span><span class="w"> </span><span class="nx">k</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="mf">1</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="p">(</span><span class="nx">n</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mf">2</span><span class="p">)))</span><span class="w"> </span><span class="o">^</span><span class="w"> </span><span class="mf">1</span><span class="p">;</span>
86660+ <span class="p">}</span>
86661+ </code></pre></div></td></tr></table></div>
86662+ </div>
8663186663</div>
8663286664</div>
8663386665<!-- solution:end -->
8663486666
8663586667<!-- solution:start -->
8663686668
86637- <h3 id="solution-2">Solution 2</h3>
86638- <div class="tabbed-set tabbed-alternate" data-tabs="2:4"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><input id="__tabbed_2_3" name="__tabbed_2" type="radio" /><input id="__tabbed_2_4" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">Python3</label><label for="__tabbed_2_2">Java</label><label for="__tabbed_2_3">C++</label><label for="__tabbed_2_4">Go</label></div>
86669+ <h3 id="solution-2-bit-manipulation-brain-teaser">Solution 2: Bit Manipulation + Brain Teaser</h3>
86670+ <p>In the problem, the index starts from <span class="arithmatex">\(1\)</span>. We will change <span class="arithmatex">\(k\)</span> to <span class="arithmatex">\(k-1\)</span>, converting the index to start from <span class="arithmatex">\(0\)</span>. In the following discussion, all indices start from <span class="arithmatex">\(0\)</span>.</p>
86671+ <p>Upon closer observation, the <span class="arithmatex">\(i\)</span>-th character in a row generates two characters at positions <span class="arithmatex">\(2i\)</span> and <span class="arithmatex">\(2i+1\)</span> in the next row.</p>
86672+ <div class="highlight"><pre><span></span><code>0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0
86673+ </code></pre></div>
86674+ <p>If the <span class="arithmatex">\(i\)</span>-th character is <span class="arithmatex">\(0\)</span>, then the characters generated at positions <span class="arithmatex">\(2i\)</span> and <span class="arithmatex">\(2i+1\)</span> are <span class="arithmatex">\(0\)</span> and <span class="arithmatex">\(1\)</span>, respectively. If the <span class="arithmatex">\(i\)</span>-th character is <span class="arithmatex">\(1\)</span>, the generated characters are <span class="arithmatex">\(1\)</span> and <span class="arithmatex">\(0\)</span>.</p>
86675+ <div class="highlight"><pre><span></span><code>0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0
86676+ ^ * *
86677+ </code></pre></div>
86678+ <div class="highlight"><pre><span></span><code>0 1 1 0 1 0 0 1 1 0 0 1 0 1 1 0
86679+ ^ * *
86680+ </code></pre></div>
86681+ <p>We can see that the character at position <span class="arithmatex">\(2i\)</span> (even index) is always the same as the character at position <span class="arithmatex">\(i\)</span>, while the character at position <span class="arithmatex">\(2i+1\)</span> (odd index) is the inversion of the character at position <span class="arithmatex">\(i\)</span>. In other words, characters at odd indices are always the result of one inversion. If the number of inversions is even, the character remains unchanged; if the number of inversions is odd, it is equivalent to one inversion.</p>
86682+ <p>Therefore, we only need to check whether <span class="arithmatex">\(k\)</span> is odd. If it is, we accumulate one inversion. Then, we divide <span class="arithmatex">\(k\)</span> by <span class="arithmatex">\(2\)</span> and continue to check, accumulating the number of inversions until <span class="arithmatex">\(k\)</span> becomes <span class="arithmatex">\(0\)</span>.</p>
86683+ <p>Finally, we determine whether the number of inversions is odd. If it is, the answer is <span class="arithmatex">\(1\)</span>; otherwise, it is <span class="arithmatex">\(0\)</span>.</p>
86684+ <p>The process of accumulating the number of inversions is essentially equivalent to counting the number of <span class="arithmatex">\(1\)</span>s in the binary representation of <span class="arithmatex">\(k\)</span>.</p>
86685+ <p>The time complexity is <span class="arithmatex">\(O(\log k)\)</span>, and the space complexity is <span class="arithmatex">\(O(1)\)</span>.</p>
86686+ <div class="tabbed-set tabbed-alternate" data-tabs="2:5"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><input id="__tabbed_2_3" name="__tabbed_2" type="radio" /><input id="__tabbed_2_4" name="__tabbed_2" type="radio" /><input id="__tabbed_2_5" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">Python3</label><label for="__tabbed_2_2">Java</label><label for="__tabbed_2_3">C++</label><label for="__tabbed_2_4">Go</label><label for="__tabbed_2_5">TypeScript</label></div>
8663986687<div class="tabbed-content">
8664086688<div class="tabbed-block">
8664186689<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">1</span>
@@ -86679,6 +86727,32 @@ <h3 id="solution-2">Solution 2</h3>
8667986727<span class="p">}</span>
8668086728</code></pre></div></td></tr></table></div>
8668186729</div>
86730+ <div class="tabbed-block">
86731+ <div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 1</span>
86732+ <span class="normal"> 2</span>
86733+ <span class="normal"> 3</span>
86734+ <span class="normal"> 4</span>
86735+ <span class="normal"> 5</span>
86736+ <span class="normal"> 6</span>
86737+ <span class="normal"> 7</span>
86738+ <span class="normal"> 8</span>
86739+ <span class="normal"> 9</span>
86740+ <span class="normal">10</span>
86741+ <span class="normal">11</span>
86742+ <span class="normal">12</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="kd">function</span><span class="w"> </span><span class="nx">kthGrammar</span><span class="p">(</span><span class="nx">n</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">,</span><span class="w"> </span><span class="nx">k</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="w"> </span><span class="p">{</span>
86743+ <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">bitCount</span><span class="p">(</span><span class="nx">k</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mf">1</span><span class="p">)</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="mf">1</span><span class="p">;</span>
86744+ <span class="p">}</span>
86745+
86746+ <span class="kd">function</span><span class="w"> </span><span class="nx">bitCount</span><span class="p">(</span><span class="nx">i</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="w"> </span><span class="p">{</span>
86747+ <span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">((</span><span class="nx">i</span><span class="w"> </span><span class="o">>>></span><span class="w"> </span><span class="mf">1</span><span class="p">)</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="mh">0x55555555</span><span class="p">);</span>
86748+ <span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="mh">0x33333333</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">((</span><span class="nx">i</span><span class="w"> </span><span class="o">>>></span><span class="w"> </span><span class="mf">2</span><span class="p">)</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="mh">0x33333333</span><span class="p">);</span>
86749+ <span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="o">>>></span><span class="w"> </span><span class="mf">4</span><span class="p">))</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="mh">0x0f0f0f0f</span><span class="p">;</span>
86750+ <span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="o">>>></span><span class="w"> </span><span class="mf">8</span><span class="p">);</span>
86751+ <span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="nx">i</span><span class="w"> </span><span class="o">>>></span><span class="w"> </span><span class="mf">16</span><span class="p">);</span>
86752+ <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="mh">0x3f</span><span class="p">;</span>
86753+ <span class="p">}</span>
86754+ </code></pre></div></td></tr></table></div>
86755+ </div>
8668286756</div>
8668386757</div>
8668486758<!-- solution:end -->
0 commit comments