commit 21b606dfb7c33287f4bf74bc8713a4c7b5ac210d
parent 4bbbb9ff59923a8c1e7ec9d49f5d7833830766a8
Author: Jack Sangdahl <jack@pngu.org>
Date: Sat, 21 Feb 2026 09:58:33 -0700
Add leetcode page
Diffstat:
2 files changed, 99 insertions(+), 1 deletion(-)
diff --git a/content.html b/content.html
@@ -25,7 +25,7 @@
</ul>
<h4>Projects</h4>
<ul>
- <li><a href="https://leetcode.com/0x6A73" target="_blank">Leetcode</a></li>
+ <li><a href="leetcode.html">Leetcode</a></li>
<li><a href="https://git.pngu.org/cryptopals" target="_blank">Cryptopals</a></li>
<li><a href="https://git.pngu.org/aoc" target="_blank">Advent of Code</a></li>
<li><a href="synacor.html">Synacor Challenge</a></li>
diff --git a/leetcode.html b/leetcode.html
@@ -0,0 +1,98 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
+ <title>Leetcode</title>
+ <script src="header.js"></script>
+</head>
+
+<body>
+ <a style="text-decoration: none" href="content.html"><--</a>
+ <h2>Leetcode</h2>
+ <p><i>2025-02-23</i></p>
+ <hr />
+ <p>I have been completing <a href="https://leetcode.com/u/0x6A73" target="_blank">Leetcode</a> problems for quite some
+ time
+ now, and at the time of writing have a 1,400 day streak and am ranked about 6,500 worldwide. Many problems end up
+ feeling quite similar to others, however I greatly enjoy bit manipulation type problems, as these still puzzle me
+ often. I solve the daily problem in both C and Python3, unless the C solution would require hundreds of
+ LoC to implement. My solutions can be found <a href="https://pngu.org/leetcode" target="_blank">here</a>, along with
+ some utility functions.
+ </p>
+ <h3>C Utilities</h3>
+ <p>The <a href="https://git.pngu.org/leetcode/tree/leetcode.h" target="_blank"><code>leetcode.h</code></a> header file
+ contains various includes, standard Leetcode structs (<code>ListNode</code>, <code>TreeNode</code>), and macros for
+ things like calculating the size of an array (<i>in a portable manner</i>):</p>
+ <pre><code class="language-c">#define IS_ARRAY(value) \
+ (!__builtin_types_compatible_p(typeof((value)), typeof(&(value)[0])))
+
+ #define ARRAY_SIZE(array) \
+ (__builtin_choose_expr(IS_ARRAY((array)), \
+ sizeof((array)) / sizeof((array)[0]), (void)0))
+
+ // foo.c
+ int arr[] = {1, 2, 3};
+ int foo = func(arr, ARRAY_SIZE(arr));</code></pre>
+ <p>The <a href="https://git.pngu.org/leetcode/tree/leetcode.c" target="_blank"><code>leetcode.c</code></a> file
+ contains helper functions to fill <code>ListNode</code> and <code>TreeNode</code> data structures with given problem
+ input, and also print data returned by such functions.
+ </p>
+ <h4><code>ListNode</code> Data Type</h4>
+ <img class="inline-image" src="https://assets.leetcode.com/uploads/2022/02/02/ex1-1.png" alt="list node example">
+ <pre><code class="language-c">int main() {
+ int input[] = {0, 3, 1, 0, 4, 5, 2, 0};
+ struct ListNode *head = listnode_build(input, ARRAY_SIZE(input));
+ listnode_print(head);
+ listnode_free(head);
+ }</code></pre>
+ <h4><code>TreeNode</code> Data Type</h4>
+ <img class="inline-image" src="https://assets.leetcode.com/uploads/2021/04/08/leftsum-tree.jpg"
+ alt="tree node example">
+ <p>Note that in the following, a value of -1 denotes a "null" leaf. If a problem's input depends on this value, use
+ <code>treenode_create()</code> to create each node individually.
+ </p>
+ <pre><code class="language-c">int main() {
+ int input[] = {3, 9, 20, -1, -1, 15, 7};
+ struct TreeNode *root = treenode_build(input, ARRAY_SIZE(input));
+ treenode_print(root);
+ treenode_free(root);
+ }</code></pre>
+ <h4>2D Array Helpers</h4>
+ <p>These functions dynamically allocate and fill a 2D array with values from a static array of values.</p>
+ <pre><code class="language-c">int func(int **edges, int edgesSize, int *edgesColSize);
+
+ int main() {
+ int edges_input[6][2] = {{0, 1}, {0, 2}, {1, 3}, {1, 4}, {2, 5}, {2, 6}};
+ struct two_d_arr *edges = two_d_arr_init(ARRAY_SIZE(edges_input), ARRAY_SIZE(edges_input[0]), edges_input);
+ int res = func(edges.arr, edges.row_size, edges.col_size);
+ two_d_arr_free(edges);
+ }
+ </code></pre>
+ <p>If a problem's input has varying sized columns, one must create a array specifying each column's size and pass that
+ to the function, instead of <code>struct two_d_arr.col_size</code>.</p>
+ <h3>Python Utilities</h3>
+ <p>Quite similar to the above, <a href="https://git.pngu.org/leetcode/tree/leetcode.py"
+ target="_blank"><code>leetcode.py</code></a>
+ contains helpers to work Leetcode data structures. Python, of course, does not require special handling for things
+ like 2D arrays.</p>
+ <h4><code>ListNode</code> Data Type</h4>
+ <pre><code class="language-python">from leetcode import ListNode, listnode_build, listnode_print
+
+ if __name__ == "__main__":
+ head = listnode_build(vals=[0, 3, 1, 0, 4, 5, 2, 0])
+ listnode_print(head)
+ </code></pre>
+ <h4><code>TreeNode</code> Data Type</h4>
+ <p>Note that in the following, a value of <code>None</code> denotes a "null" leaf.</p>
+ <pre><code class="language-python">from leetcode import TreeNode, treenode_build, treenode_print
+
+ if __name__ == "__main__":
+ root = treenode_build(vals=[3, 9, 20, None, None, 15, 7])
+ treenode_print(root)
+ </code></pre>
+ <script src="frame.js"></script>
+</body>
+
+</html>