@@ -24597,18 +24597,18 @@
24597
24597
<ul class="md-nav__list">
24598
24598
24599
24599
<li class="md-nav__item">
24600
- <a href="#solution-1" class="md-nav__link">
24600
+ <a href="#solution-1-recursion " class="md-nav__link">
24601
24601
<span class="md-ellipsis">
24602
- Solution 1
24602
+ Solution 1: Recursion
24603
24603
</span>
24604
24604
</a>
24605
24605
24606
24606
</li>
24607
24607
24608
24608
<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">
24610
24610
<span class="md-ellipsis">
24611
- Solution 2
24611
+ Solution 2: Bit Manipulation + Brain Teaser
24612
24612
</span>
24613
24613
</a>
24614
24614
@@ -86519,7 +86519,7 @@ <h2 id="description">Description</h2>
86519
86519
<pre>
86520
86520
<strong>Input:</strong> n = 2, k = 1
86521
86521
<strong>Output:</strong> 0
86522
- <strong>Explanation:</strong>
86522
+ <strong>Explanation:</strong>
86523
86523
row 1: 0
86524
86524
row 2: <u>0</u>1
86525
86525
</pre>
@@ -86529,7 +86529,7 @@ <h2 id="description">Description</h2>
86529
86529
<pre>
86530
86530
<strong>Input:</strong> n = 2, k = 2
86531
86531
<strong>Output:</strong> 1
86532
- <strong>Explanation:</strong>
86532
+ <strong>Explanation:</strong>
86533
86533
row 1: 0
86534
86534
row 2: 0<u>1</u>
86535
86535
</pre>
@@ -86547,8 +86547,20 @@ <h2 id="description">Description</h2>
86547
86547
<h2 id="solutions">Solutions</h2>
86548
86548
<!-- solution:start -->
86549
86549
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>
86552
86564
<div class="tabbed-content">
86553
86565
<div class="tabbed-block">
86554
86566
<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>
86628
86640
<span class="p">}</span>
86629
86641
</code></pre></div></td></tr></table></div>
86630
86642
</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>
86631
86663
</div>
86632
86664
</div>
86633
86665
<!-- solution:end -->
86634
86666
86635
86667
<!-- solution:start -->
86636
86668
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>
86639
86687
<div class="tabbed-content">
86640
86688
<div class="tabbed-block">
86641
86689
<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>
86679
86727
<span class="p">}</span>
86680
86728
</code></pre></div></td></tr></table></div>
86681
86729
</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>
86682
86756
</div>
86683
86757
</div>
86684
86758
<!-- solution:end -->
0 commit comments