+
-
-
-
-
-
-
-
-
-
-
389. Find the Difference
-
-
-
- Please login first.
-
-
-
-
-
-
-
-
-
-
- - Total Accepted: 15674
- - Total Submissions: 32141
- - Difficulty: Easy
-
-
-
-
-Given two strings s and t which consist of only lowercase letters.
-
-
String t is generated by random shuffling string s and then add one more letter at a random position.
-
-
Find the letter that was added in t.
-
-
Example:
-
-Input:
-s = "abcd"
-t = "abcde"
-
-Output:
-e
-
-Explanation:
-'e' is the letter that was added.
-
-
-
-
Subscribe to see which companies asked this question
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Have you met this question in a real interview?
-
-
-
- Yes
-
-
- No
-
-
-
-
-
When did you meet this question?
-
-
-
-
- last week
-
-
-
- last month
-
-
-
- last 3 month
-
-
-
- last 6 month
-
-
-
- more than 6 months
-
-
-
- other
-
-
-
-
-
-
-
Which company asked you this question?
-
-
-
-
- Adobe
-
-
-
- Airbnb
-
-
-
- Alation
-
-
-
- Alibaba
-
-
-
- Amazon
-
-
-
- Apple
-
-
-
- Arista
-
-
-
- Baidu
-
-
-
- Blend Labs
-
-
-
- Blizzard
-
-
-
- Bloomberg
-
-
-
- Box
-
-
-
- Bungie
-
-
-
- Cisco
-
-
-
- Conviva
-
-
-
- Coursera
-
-
-
- CreditEase
-
-
-
- Deutsche Bank
-
-
-
- Dropbox
-
-
-
- eBay
-
-
-
- Electronic Arts
-
-
-
- EMC
-
-
-
- Epic Systems
-
-
-
- Expedia
-
-
-
- Facebook
-
-
-
- Flipkart
-
-
-
- Fortinet
-
-
-
- FreeWheel
-
-
-
- Goldman Sachs
-
-
-
- Google
-
-
-
- GrabTaxi
-
-
-
- Groupon
-
-
-
- Hedvig
-
-
-
- Hulu
-
-
-
- Intel
-
-
-
- Jane Street
-
-
-
- JPMorgan
-
-
-
- Jump Trading
-
-
-
- Lending Club
-
-
-
- LinkedIn
-
-
-
- LiveRamp
-
-
-
- Marvel
-
-
-
- Matlab
-
-
-
- McKesson
-
-
-
- Microsoft
-
-
-
- Morgan Stanley
-
-
-
- Nvidia
-
-
-
- Oracle
-
-
-
- Orbitz
-
-
-
- Palantir
-
-
-
- Paypal
-
-
-
- Pinterest
-
-
-
- Pocket Gems
-
-
-
- Qualtrics
-
-
-
- Qumulo
-
-
-
- Quora
-
-
-
- Rackspace
-
-
-
- Salesforce
-
-
-
- Sina
-
-
-
- Snapchat
-
-
-
- Square
-
-
-
- Sumologic
-
-
-
- Symantec
-
-
-
- Tencent
-
-
-
- TinyCo
-
-
-
- Tradeshift
-
-
-
- TripAdvisor
-
-
-
- Twitter
-
-
-
- Two Sigma
-
-
-
- Uber
-
-
-
- VMware
-
-
-
- Walmart
-
-
-
- Yahoo
-
-
-
- Yandex
-
-
-
- Yelp
-
-
-
- Zenefits
-
-
-
- Zynga
-
-
-
-
-
-
-
-
-
-
-
-
- Discuss
+
+
+
+
+
or you can sign in with
+
+
+
+
@@ -780,7 +282,7 @@ Explanation:
-
+
-
+
-
-
-
-
-
-
diff --git a/test/mock/problems.nologin.json.20161015 b/test/mock/problems.nologin.json.20161015
new file mode 100644
index 00000000..a186cd9a
--- /dev/null
+++ b/test/mock/problems.nologin.json.20161015
@@ -0,0 +1 @@
+{"frequency_mid": 0, "num_solved": 0, "category_slug": "algorithms", "stat_status_pairs": [{"status": null, "stat": {"total_acs": 961, "question__title": "Sentence Screen Fitting", "question__article__slug": null, "total_submitted": 4115, "question__title_slug": "sentence-screen-fitting", "question__article__live": null, "question__hide": false, "question_id": 418}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 1994, "question__title": "Pacific Atlantic Water Flow", "question__article__slug": null, "total_submitted": 6675, "question__title_slug": "pacific-atlantic-water-flow", "question__article__live": null, "question__hide": false, "question_id": 417}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 3851, "question__title": "Partition Equal Subset Sum", "question__article__slug": null, "total_submitted": 9972, "question__title_slug": "partition-equal-subset-sum", "question__article__live": null, "question__hide": false, "question_id": 416}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5106, "question__title": "Add Strings", "question__article__slug": null, "total_submitted": 11860, "question__title_slug": "add-strings", "question__article__live": null, "question__hide": false, "question_id": 415}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 694, "question__title": "Arithmetic Slices", "question__article__slug": null, "total_submitted": 1370, "question__title_slug": "arithmetic-slices", "question__article__live": null, "question__hide": false, "question_id": 413}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 1088, "question__title": "Fizz Buzz", "question__article__slug": null, "total_submitted": 1924, "question__title_slug": "fizz-buzz", "question__article__live": null, "question__hide": false, "question_id": 412}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 779, "question__title": "Minimum Unique Word Abbreviation", "question__article__slug": null, "total_submitted": 2738, "question__title_slug": "minimum-unique-word-abbreviation", "question__article__live": null, "question__hide": false, "question_id": 411}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 1897, "question__title": "Split Array Largest Sum", "question__article__slug": null, "total_submitted": 7092, "question__title_slug": "split-array-largest-sum", "question__article__live": null, "question__hide": false, "question_id": 410}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 7925, "question__title": "Longest Palindrome", "question__article__slug": null, "total_submitted": 17751, "question__title_slug": "longest-palindrome", "question__article__live": null, "question__hide": false, "question_id": 409}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 2177, "question__title": "Valid Word Abbreviation", "question__article__slug": null, "total_submitted": 8271, "question__title_slug": "valid-word-abbreviation", "question__article__live": null, "question__hide": false, "question_id": 408}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 1956, "question__title": "Trapping Rain Water II", "question__article__slug": null, "total_submitted": 6027, "question__title_slug": "trapping-rain-water-ii", "question__article__live": null, "question__hide": false, "question_id": 407}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5383, "question__title": "Queue Reconstruction by Height", "question__article__slug": null, "total_submitted": 9830, "question__title_slug": "queue-reconstruction-by-height", "question__article__live": null, "question__hide": false, "question_id": 406}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5697, "question__title": "Convert a Number to Hexadecimal", "question__article__slug": null, "total_submitted": 13646, "question__title_slug": "convert-a-number-to-hexadecimal", "question__article__live": null, "question__hide": false, "question_id": 405}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12107, "question__title": "Sum of Left Leaves", "question__article__slug": null, "total_submitted": 26229, "question__title_slug": "sum-of-left-leaves", "question__article__live": null, "question__hide": false, "question_id": 404}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 4825, "question__title": "Frog Jump", "question__article__slug": null, "total_submitted": 15683, "question__title_slug": "frog-jump", "question__article__live": null, "question__hide": false, "question_id": 403}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5422, "question__title": "Remove K Digits", "question__article__slug": null, "total_submitted": 21124, "question__title_slug": "remove-k-digits", "question__article__live": null, "question__hide": false, "question_id": 402}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 8118, "question__title": "Binary Watch", "question__article__slug": null, "total_submitted": 19013, "question__title_slug": "binary-watch", "question__article__live": null, "question__hide": false, "question_id": 401}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 6516, "question__title": "Nth Digit", "question__article__slug": null, "total_submitted": 21540, "question__title_slug": "nth-digit", "question__article__live": null, "question__hide": false, "question_id": 400}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 4105, "question__title": "Evaluate Division", "question__article__slug": null, "total_submitted": 10993, "question__title_slug": "evaluate-division", "question__article__live": null, "question__hide": false, "question_id": 399}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5368, "question__title": "Random Pick Index", "question__article__slug": null, "total_submitted": 15123, "question__title_slug": "random-pick-index", "question__article__live": null, "question__hide": false, "question_id": 398}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 7612, "question__title": "Integer Replacement", "question__article__slug": null, "total_submitted": 27315, "question__title_slug": "integer-replacement", "question__article__live": null, "question__hide": false, "question_id": 397}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 7968, "question__title": "Rotate Function", "question__article__slug": null, "total_submitted": 27476, "question__title_slug": "rotate-function", "question__article__live": null, "question__hide": false, "question_id": 396}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 4935, "question__title": "Longest Substring with At Least K Repeating Characters", "question__article__slug": null, "total_submitted": 14631, "question__title_slug": "longest-substring-with-at-least-k-repeating-characters", "question__article__live": null, "question__hide": false, "question_id": 395}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 8077, "question__title": "Decode String", "question__article__slug": null, "total_submitted": 20485, "question__title_slug": "decode-string", "question__article__live": null, "question__hide": false, "question_id": 394}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 4326, "question__title": "UTF-8 Validation", "question__article__slug": null, "total_submitted": 12603, "question__title_slug": "utf-8-validation", "question__article__live": null, "question__hide": false, "question_id": 393}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 11853, "question__title": "Is Subsequence", "question__article__slug": null, "total_submitted": 27079, "question__title_slug": "is-subsequence", "question__article__live": null, "question__hide": false, "question_id": 392}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 3555, "question__title": "Perfect Rectangle", "question__article__slug": null, "total_submitted": 17814, "question__title_slug": "perfect-rectangle", "question__article__live": null, "question__hide": false, "question_id": 391}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 3238, "question__title": "Elimination Game", "question__article__slug": null, "total_submitted": 9989, "question__title_slug": "elimination-game", "question__article__live": null, "question__hide": false, "question_id": 390}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 27872, "question__title": "Find the Difference", "question__article__slug": null, "total_submitted": 56037, "question__title_slug": "find-the-difference", "question__article__live": null, "question__hide": false, "question_id": 389}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 8900, "question__title": "Longest Absolute File Path", "question__article__slug": null, "total_submitted": 27757, "question__title_slug": "longest-absolute-file-path", "question__article__live": null, "question__hide": false, "question_id": 388}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 21887, "question__title": "First Unique Character in a String", "question__article__slug": null, "total_submitted": 49759, "question__title_slug": "first-unique-character-in-a-string", "question__article__live": null, "question__hide": false, "question_id": 387}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 7673, "question__title": "Lexicographical Numbers", "question__article__slug": null, "total_submitted": 21003, "question__title_slug": "lexicographical-numbers", "question__article__live": null, "question__hide": false, "question_id": 386}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 6408, "question__title": "Mini Parser", "question__article__slug": null, "total_submitted": 22241, "question__title_slug": "mini-parser", "question__article__live": null, "question__hide": false, "question_id": 385}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 11209, "question__title": "Shuffle an Array", "question__article__slug": null, "total_submitted": 25206, "question__title_slug": "shuffle-an-array", "question__article__live": null, "question__hide": false, "question_id": 384}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 23743, "question__title": "Ransom Note", "question__article__slug": null, "total_submitted": 52480, "question__title_slug": "ransom-note", "question__article__live": null, "question__hide": false, "question_id": 383}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12247, "question__title": "Linked List Random Node", "question__article__slug": null, "total_submitted": 26891, "question__title_slug": "linked-list-random-node", "question__article__live": null, "question__hide": false, "question_id": 382}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5269, "question__title": "Insert Delete GetRandom O(1) - Duplicates allowed", "question__article__slug": null, "total_submitted": 19792, "question__title_slug": "insert-delete-getrandom-o1-duplicates-allowed", "question__article__live": null, "question__hide": false, "question_id": 381}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 8881, "question__title": "Insert Delete GetRandom O(1)", "question__article__slug": null, "total_submitted": 24556, "question__title_slug": "insert-delete-getrandom-o1", "question__article__live": null, "question__hide": false, "question_id": 380}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 3686, "question__title": "Design Phone Directory", "question__article__slug": null, "total_submitted": 13401, "question__title_slug": "design-phone-directory", "question__article__live": null, "question__hide": false, "question_id": 379}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15747, "question__title": "Kth Smallest Element in a Sorted Matrix", "question__article__slug": null, "total_submitted": 37261, "question__title_slug": "kth-smallest-element-in-a-sorted-matrix", "question__article__live": null, "question__hide": false, "question_id": 378}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15150, "question__title": "Combination Sum IV", "question__article__slug": null, "total_submitted": 37273, "question__title_slug": "combination-sum-iv", "question__article__live": null, "question__hide": false, "question_id": 377}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12387, "question__title": "Wiggle Subsequence", "question__article__slug": "wiggle-subsequence", "total_submitted": 36030, "question__title_slug": "wiggle-subsequence", "question__article__live": true, "question__hide": false, "question_id": 376}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 9787, "question__title": "Guess Number Higher or Lower II", "question__article__slug": null, "total_submitted": 29577, "question__title_slug": "guess-number-higher-or-lower-ii", "question__article__live": null, "question__hide": false, "question_id": 375}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 25361, "question__title": "Guess Number Higher or Lower", "question__article__slug": "guess-number-higher-or-lower", "total_submitted": 77982, "question__title_slug": "guess-number-higher-or-lower", "question__article__live": true, "question__hide": false, "question_id": 374}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 13851, "question__title": "Find K Pairs with Smallest Sums", "question__article__slug": null, "total_submitted": 48481, "question__title_slug": "find-k-pairs-with-smallest-sums", "question__article__live": null, "question__hide": false, "question_id": 373}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 9026, "question__title": "Super Pow", "question__article__slug": null, "total_submitted": 28028, "question__title_slug": "super-pow", "question__article__live": null, "question__hide": false, "question_id": 372}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 40395, "question__title": "Sum of Two Integers", "question__article__slug": null, "total_submitted": 78152, "question__title_slug": "sum-of-two-integers", "question__article__live": null, "question__hide": false, "question_id": 371}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5177, "question__title": "Range Addition", "question__article__slug": "range-addition", "total_submitted": 10031, "question__title_slug": "range-addition", "question__article__live": true, "question__hide": false, "question_id": 370}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 6477, "question__title": "Plus One Linked List", "question__article__slug": null, "total_submitted": 12648, "question__title_slug": "plus-one-linked-list", "question__article__live": null, "question__hide": false, "question_id": 369}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12624, "question__title": "Largest Divisible Subset", "question__article__slug": null, "total_submitted": 39288, "question__title_slug": "largest-divisible-subset", "question__article__live": null, "question__hide": false, "question_id": 368}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 19883, "question__title": "Valid Perfect Square", "question__article__slug": null, "total_submitted": 54020, "question__title_slug": "valid-perfect-square", "question__article__live": null, "question__hide": false, "question_id": 367}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 6772, "question__title": "Find Leaves of Binary Tree", "question__article__slug": null, "total_submitted": 12203, "question__title_slug": "find-leaves-of-binary-tree", "question__article__live": null, "question__hide": false, "question_id": 366}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 8074, "question__title": "Water and Jug Problem", "question__article__slug": null, "total_submitted": 32047, "question__title_slug": "water-and-jug-problem", "question__article__live": null, "question__hide": false, "question_id": 365}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5434, "question__title": "Nested List Weight Sum II", "question__article__slug": null, "total_submitted": 11092, "question__title_slug": "nested-list-weight-sum-ii", "question__article__live": null, "question__hide": false, "question_id": 364}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 6638, "question__title": "Max Sum of Rectangle No Larger Than K", "question__article__slug": null, "total_submitted": 21516, "question__title_slug": "max-sum-of-sub-matrix-no-larger-than-k", "question__article__live": null, "question__hide": false, "question_id": 363}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5970, "question__title": "Design Hit Counter", "question__article__slug": null, "total_submitted": 11647, "question__title_slug": "design-hit-counter", "question__article__live": null, "question__hide": false, "question_id": 362}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5353, "question__title": "Bomb Enemy", "question__article__slug": null, "total_submitted": 14250, "question__title_slug": "bomb-enemy", "question__article__live": null, "question__hide": false, "question_id": 361}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 4784, "question__title": "Sort Transformed Array", "question__article__slug": null, "total_submitted": 11531, "question__title_slug": "sort-transformed-array", "question__article__live": null, "question__hide": false, "question_id": 360}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 6753, "question__title": "Logger Rate Limiter", "question__article__slug": null, "total_submitted": 11903, "question__title_slug": "logger-rate-limiter", "question__article__live": null, "question__hide": false, "question_id": 359}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 4090, "question__title": "Rearrange String k Distance Apart", "question__article__slug": null, "total_submitted": 13390, "question__title_slug": "rearrange-string-k-distance-apart", "question__article__live": null, "question__hide": false, "question_id": 358}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 18839, "question__title": "Count Numbers with Unique Digits", "question__article__slug": null, "total_submitted": 42554, "question__title_slug": "count-numbers-with-unique-digits", "question__article__live": null, "question__hide": false, "question_id": 357}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 4859, "question__title": "Line Reflection", "question__article__slug": null, "total_submitted": 16804, "question__title_slug": "line-reflection", "question__article__live": null, "question__hide": false, "question_id": 356}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 9026, "question__title": "Design Twitter", "question__article__slug": null, "total_submitted": 37948, "question__title_slug": "design-twitter", "question__article__live": null, "question__hide": false, "question_id": 355}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 10677, "question__title": "Russian Doll Envelopes", "question__article__slug": null, "total_submitted": 34824, "question__title_slug": "russian-doll-envelopes", "question__article__live": null, "question__hide": false, "question_id": 354}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 3959, "question__title": "Design Snake Game", "question__article__slug": null, "total_submitted": 16090, "question__title_slug": "design-snake-game", "question__article__live": null, "question__hide": false, "question_id": 353}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 7194, "question__title": "Data Stream as Disjoint Intervals", "question__article__slug": null, "total_submitted": 18719, "question__title_slug": "data-stream-as-disjoint-intervals", "question__article__live": null, "question__hide": false, "question_id": 352}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5643, "question__title": "Android Unlock Patterns", "question__article__slug": "android-unlock-patterns", "total_submitted": 13988, "question__title_slug": "android-unlock-patterns", "question__article__live": true, "question__hide": false, "question_id": 351}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 37367, "question__title": "Intersection of Two Arrays II", "question__article__slug": null, "total_submitted": 87536, "question__title_slug": "intersection-of-two-arrays-ii", "question__article__live": null, "question__hide": false, "question_id": 350}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 53008, "question__title": "Intersection of Two Arrays", "question__article__slug": null, "total_submitted": 118471, "question__title_slug": "intersection-of-two-arrays", "question__article__live": null, "question__hide": false, "question_id": 349}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 5798, "question__title": "Design Tic-Tac-Toe", "question__article__slug": null, "total_submitted": 12970, "question__title_slug": "design-tic-tac-toe", "question__article__live": null, "question__hide": false, "question_id": 348}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 34589, "question__title": "Top K Frequent Elements", "question__article__slug": null, "total_submitted": 77455, "question__title_slug": "top-k-frequent-elements", "question__article__live": null, "question__hide": false, "question_id": 347}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 9948, "question__title": "Moving Average from Data Stream", "question__article__slug": null, "total_submitted": 17742, "question__title_slug": "moving-average-from-data-stream", "question__article__live": null, "question__hide": false, "question_id": 346}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 48755, "question__title": "Reverse Vowels of a String", "question__article__slug": null, "total_submitted": 133038, "question__title_slug": "reverse-vowels-of-a-string", "question__article__live": null, "question__hide": false, "question_id": 345}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 97981, "question__title": "Reverse String", "question__article__slug": null, "total_submitted": 168674, "question__title_slug": "reverse-string", "question__article__live": null, "question__hide": false, "question_id": 344}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 28286, "question__title": "Integer Break", "question__article__slug": null, "total_submitted": 64267, "question__title_slug": "integer-break", "question__article__live": null, "question__hide": false, "question_id": 343}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 41993, "question__title": "Power of Four", "question__article__slug": null, "total_submitted": 114286, "question__title_slug": "power-of-four", "question__article__live": null, "question__hide": false, "question_id": 342}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 18465, "question__title": "Flatten Nested List Iterator", "question__article__slug": null, "total_submitted": 51088, "question__title_slug": "flatten-nested-list-iterator", "question__article__live": null, "question__hide": false, "question_id": 341}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 8802, "question__title": "Longest Substring with At Most K Distinct Characters", "question__article__slug": null, "total_submitted": 22490, "question__title_slug": "longest-substring-with-at-most-k-distinct-characters", "question__article__live": null, "question__hide": false, "question_id": 340}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 10047, "question__title": "Nested List Weight Sum", "question__article__slug": "nested-list-weight-sum", "total_submitted": 17101, "question__title_slug": "nested-list-weight-sum", "question__article__live": true, "question__hide": false, "question_id": 339}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 49906, "question__title": "Counting Bits", "question__article__slug": null, "total_submitted": 84887, "question__title_slug": "counting-bits", "question__article__live": null, "question__hide": false, "question_id": 338}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 26999, "question__title": "House Robber III", "question__article__slug": null, "total_submitted": 66696, "question__title_slug": "house-robber-iii", "question__article__live": null, "question__hide": false, "question_id": 337}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 14039, "question__title": "Palindrome Pairs", "question__article__slug": null, "total_submitted": 60776, "question__title_slug": "palindrome-pairs", "question__article__live": null, "question__hide": false, "question_id": 336}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 9906, "question__title": "Self Crossing", "question__article__slug": null, "total_submitted": 43151, "question__title_slug": "self-crossing", "question__article__live": null, "question__hide": false, "question_id": 335}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 25744, "question__title": "Increasing Triplet Subsequence", "question__article__slug": null, "total_submitted": 69771, "question__title_slug": "increasing-triplet-subsequence", "question__article__live": null, "question__hide": false, "question_id": 334}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 7955, "question__title": "Largest BST Subtree", "question__article__slug": null, "total_submitted": 27481, "question__title_slug": "largest-bst-subtree", "question__article__live": null, "question__hide": false, "question_id": 333}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 20809, "question__title": "Reconstruct Itinerary", "question__article__slug": null, "total_submitted": 76849, "question__title_slug": "reconstruct-itinerary", "question__article__live": null, "question__hide": false, "question_id": 332}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 23525, "question__title": "Verify Preorder Serialization of a Binary Tree", "question__article__slug": null, "total_submitted": 68860, "question__title_slug": "verify-preorder-serialization-of-a-binary-tree", "question__article__live": null, "question__hide": false, "question_id": 331}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15799, "question__title": "Patching Array", "question__article__slug": null, "total_submitted": 51148, "question__title_slug": "patching-array", "question__article__live": null, "question__hide": false, "question_id": 330}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 23136, "question__title": "Longest Increasing Path in a Matrix", "question__article__slug": null, "total_submitted": 67721, "question__title_slug": "longest-increasing-path-in-a-matrix", "question__article__live": null, "question__hide": false, "question_id": 329}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 47254, "question__title": "Odd Even Linked List", "question__article__slug": "odd-even-linked-list", "total_submitted": 115417, "question__title_slug": "odd-even-linked-list", "question__article__live": true, "question__hide": false, "question_id": 328}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 11614, "question__title": "Count of Range Sum", "question__article__slug": null, "total_submitted": 41735, "question__title_slug": "count-of-range-sum", "question__article__live": null, "question__hide": false, "question_id": 327}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 69234, "question__title": "Power of Three", "question__article__slug": "power-of-three", "total_submitted": 178778, "question__title_slug": "power-of-three", "question__article__live": true, "question__hide": false, "question_id": 326}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12042, "question__title": "Maximum Size Subarray Sum Equals k", "question__article__slug": null, "total_submitted": 29140, "question__title_slug": "maximum-size-subarray-sum-equals-k", "question__article__live": null, "question__hide": false, "question_id": 325}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 18400, "question__title": "Wiggle Sort II", "question__article__slug": null, "total_submitted": 75287, "question__title_slug": "wiggle-sort-ii", "question__article__live": null, "question__hide": false, "question_id": 324}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 14678, "question__title": "Number of Connected Components in an Undirected Graph", "question__article__slug": null, "total_submitted": 32362, "question__title_slug": "number-of-connected-components-in-an-undirected-graph", "question__article__live": null, "question__hide": false, "question_id": 323}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 38744, "question__title": "Coin Change", "question__article__slug": "coin-change", "total_submitted": 150008, "question__title_slug": "coin-change", "question__article__live": true, "question__hide": false, "question_id": 322}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 11836, "question__title": "Create Maximum Number", "question__article__slug": null, "total_submitted": 51348, "question__title_slug": "create-maximum-number", "question__article__live": null, "question__hide": false, "question_id": 321}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12364, "question__title": "Generalized Abbreviation", "question__article__slug": null, "total_submitted": 29419, "question__title_slug": "generalized-abbreviation", "question__article__live": null, "question__hide": false, "question_id": 320}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 29726, "question__title": "Bulb Switcher", "question__article__slug": null, "total_submitted": 71595, "question__title_slug": "bulb-switcher", "question__article__live": null, "question__hide": false, "question_id": 319}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 35495, "question__title": "Maximum Product of Word Lengths", "question__article__slug": null, "total_submitted": 85674, "question__title_slug": "maximum-product-of-word-lengths", "question__article__live": null, "question__hide": false, "question_id": 318}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 8327, "question__title": "Shortest Distance from All Buildings", "question__article__slug": null, "total_submitted": 25843, "question__title_slug": "shortest-distance-from-all-buildings", "question__article__live": null, "question__hide": false, "question_id": 317}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 20800, "question__title": "Remove Duplicate Letters", "question__article__slug": null, "total_submitted": 75202, "question__title_slug": "remove-duplicate-letters", "question__article__live": null, "question__hide": false, "question_id": 316}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 19984, "question__title": "Count of Smaller Numbers After Self", "question__article__slug": null, "total_submitted": 61099, "question__title_slug": "count-of-smaller-numbers-after-self", "question__article__live": null, "question__hide": false, "question_id": 315}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 11963, "question__title": "Binary Tree Vertical Order Traversal", "question__article__slug": null, "total_submitted": 35521, "question__title_slug": "binary-tree-vertical-order-traversal", "question__article__live": null, "question__hide": false, "question_id": 314}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 25014, "question__title": "Super Ugly Number", "question__article__slug": null, "total_submitted": 68514, "question__title_slug": "super-ugly-number", "question__article__live": null, "question__hide": false, "question_id": 313}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 16716, "question__title": "Burst Balloons", "question__article__slug": null, "total_submitted": 41184, "question__title_slug": "burst-balloons", "question__article__live": null, "question__hide": false, "question_id": 312}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12396, "question__title": "Sparse Matrix Multiplication", "question__article__slug": null, "total_submitted": 25068, "question__title_slug": "sparse-matrix-multiplication", "question__article__live": null, "question__hide": false, "question_id": 311}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 21443, "question__title": "Minimum Height Trees", "question__article__slug": null, "total_submitted": 76688, "question__title_slug": "minimum-height-trees", "question__article__live": null, "question__hide": false, "question_id": 310}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 27261, "question__title": "Best Time to Buy and Sell Stock with Cooldown", "question__article__slug": null, "total_submitted": 69931, "question__title_slug": "best-time-to-buy-and-sell-stock-with-cooldown", "question__article__live": null, "question__hide": false, "question_id": 309}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 7264, "question__title": "Range Sum Query 2D - Mutable", "question__article__slug": null, "total_submitted": 35719, "question__title_slug": "range-sum-query-2d-mutable", "question__article__live": null, "question__hide": false, "question_id": 308}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 21217, "question__title": "Range Sum Query - Mutable", "question__article__slug": "range-sum-query-mutable", "total_submitted": 114473, "question__title_slug": "range-sum-query-mutable", "question__article__live": true, "question__hide": false, "question_id": 307}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 17345, "question__title": "Additive Number", "question__article__slug": null, "total_submitted": 64563, "question__title_slug": "additive-number", "question__article__live": null, "question__hide": false, "question_id": 306}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 11937, "question__title": "Number of Islands II", "question__article__slug": null, "total_submitted": 32411, "question__title_slug": "number-of-islands-ii", "question__article__live": null, "question__hide": false, "question_id": 305}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 21859, "question__title": "Range Sum Query 2D - Immutable", "question__article__slug": "range-sum-query-2d-immutable", "total_submitted": 96587, "question__title_slug": "range-sum-query-2d-immutable", "question__article__live": true, "question__hide": false, "question_id": 304}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 47341, "question__title": "Range Sum Query - Immutable", "question__article__slug": "range-sum-query-immutable", "total_submitted": 182201, "question__title_slug": "range-sum-query-immutable", "question__article__live": true, "question__hide": false, "question_id": 303}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 8535, "question__title": "Smallest Rectangle Enclosing Black Pixels", "question__article__slug": null, "total_submitted": 20313, "question__title_slug": "smallest-rectangle-enclosing-black-pixels", "question__article__live": null, "question__hide": false, "question_id": 302}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 22208, "question__title": "Remove Invalid Parentheses", "question__article__slug": null, "total_submitted": 65398, "question__title_slug": "remove-invalid-parentheses", "question__article__live": null, "question__hide": false, "question_id": 301}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 49711, "question__title": "Longest Increasing Subsequence", "question__article__slug": null, "total_submitted": 135975, "question__title_slug": "longest-increasing-subsequence", "question__article__live": null, "question__hide": false, "question_id": 300}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 44921, "question__title": "Bulls and Cows", "question__article__slug": null, "total_submitted": 138861, "question__title_slug": "bulls-and-cows", "question__article__live": null, "question__hide": false, "question_id": 299}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 16044, "question__title": "Binary Tree Longest Consecutive Sequence", "question__article__slug": "binary-tree-longest-consecutive-sequence", "total_submitted": 41302, "question__title_slug": "binary-tree-longest-consecutive-sequence", "question__article__live": true, "question__hide": false, "question_id": 298}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 33548, "question__title": "Serialize and Deserialize Binary Tree", "question__article__slug": null, "total_submitted": 110515, "question__title_slug": "serialize-and-deserialize-binary-tree", "question__article__live": null, "question__hide": false, "question_id": 297}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 7967, "question__title": "Best Meeting Point", "question__article__slug": "best-meeting-point", "total_submitted": 16147, "question__title_slug": "best-meeting-point", "question__article__live": true, "question__hide": false, "question_id": 296}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 26274, "question__title": "Find Median from Data Stream", "question__article__slug": null, "total_submitted": 114394, "question__title_slug": "find-median-from-data-stream", "question__article__live": null, "question__hide": false, "question_id": 295}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15319, "question__title": "Flip Game II", "question__article__slug": null, "total_submitted": 34846, "question__title_slug": "flip-game-ii", "question__article__live": null, "question__hide": false, "question_id": 294}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 14793, "question__title": "Flip Game", "question__article__slug": null, "total_submitted": 28121, "question__title_slug": "flip-game", "question__article__live": null, "question__hide": false, "question_id": 293}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 103703, "question__title": "Nim Game", "question__article__slug": "nim-game", "total_submitted": 190986, "question__title_slug": "nim-game", "question__article__live": true, "question__hide": false, "question_id": 292}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 9225, "question__title": "Word Pattern II", "question__article__slug": null, "total_submitted": 25024, "question__title_slug": "word-pattern-ii", "question__article__live": null, "question__hide": false, "question_id": 291}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 55154, "question__title": "Word Pattern", "question__article__slug": null, "total_submitted": 176057, "question__title_slug": "word-pattern", "question__article__live": null, "question__hide": false, "question_id": 290}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 30424, "question__title": "Game of Life", "question__article__slug": null, "total_submitted": 84745, "question__title_slug": "game-of-life", "question__article__live": null, "question__hide": false, "question_id": 289}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 17049, "question__title": "Unique Word Abbreviation", "question__article__slug": "unique-word-abbreviation", "total_submitted": 110222, "question__title_slug": "unique-word-abbreviation", "question__article__live": true, "question__hide": false, "question_id": 288}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 43071, "question__title": "Find the Duplicate Number", "question__article__slug": null, "total_submitted": 105077, "question__title_slug": "find-the-duplicate-number", "question__article__live": null, "question__hide": false, "question_id": 287}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 17161, "question__title": "Walls and Gates", "question__article__slug": "walls-and-gates", "total_submitted": 42329, "question__title_slug": "walls-and-gates", "question__article__live": true, "question__hide": false, "question_id": 286}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15940, "question__title": "Inorder Successor in BST", "question__article__slug": null, "total_submitted": 43892, "question__title_slug": "inorder-successor-in-bst", "question__article__live": null, "question__hide": false, "question_id": 285}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 30205, "question__title": "Peeking Iterator", "question__article__slug": null, "total_submitted": 86827, "question__title_slug": "peeking-iterator", "question__article__live": null, "question__hide": false, "question_id": 284}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 125192, "question__title": "Move Zeroes", "question__article__slug": "move-zeroes", "total_submitted": 268519, "question__title_slug": "move-zeroes", "question__article__live": true, "question__hide": false, "question_id": 283}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 18421, "question__title": "Expression Add Operators", "question__article__slug": null, "total_submitted": 67519, "question__title_slug": "expression-add-operators", "question__article__live": null, "question__hide": false, "question_id": 282}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15514, "question__title": "Zigzag Iterator", "question__article__slug": null, "total_submitted": 33528, "question__title_slug": "zigzag-iterator", "question__article__live": null, "question__hide": false, "question_id": 281}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 17260, "question__title": "Wiggle Sort", "question__article__slug": "wiggle-sort", "total_submitted": 32439, "question__title_slug": "wiggle-sort", "question__article__live": true, "question__hide": false, "question_id": 280}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 53183, "question__title": "Perfect Squares", "question__article__slug": null, "total_submitted": 154701, "question__title_slug": "perfect-squares", "question__article__live": null, "question__hide": false, "question_id": 279}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 66434, "question__title": "First Bad Version", "question__article__slug": "first-bad-version", "total_submitted": 278663, "question__title_slug": "first-bad-version", "question__article__live": true, "question__hide": false, "question_id": 278}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 14115, "question__title": "Find the Celebrity", "question__article__slug": null, "total_submitted": 39551, "question__title_slug": "find-the-celebrity", "question__article__live": null, "question__hide": false, "question_id": 277}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 14505, "question__title": "Paint Fence", "question__article__slug": null, "total_submitted": 43809, "question__title_slug": "paint-fence", "question__article__live": null, "question__hide": false, "question_id": 276}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 34068, "question__title": "H-Index II", "question__article__slug": null, "total_submitted": 102438, "question__title_slug": "h-index-ii", "question__article__live": null, "question__hide": false, "question_id": 275}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 50882, "question__title": "H-Index", "question__article__slug": "h-index", "total_submitted": 162380, "question__title_slug": "h-index", "question__article__live": true, "question__hide": false, "question_id": 274}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 22946, "question__title": "Integer to English Words", "question__article__slug": null, "total_submitted": 112445, "question__title_slug": "integer-to-english-words", "question__article__live": null, "question__hide": false, "question_id": 273}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 10548, "question__title": "Closest Binary Search Tree Value II", "question__article__slug": null, "total_submitted": 29184, "question__title_slug": "closest-binary-search-tree-value-ii", "question__article__live": null, "question__hide": false, "question_id": 272}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12265, "question__title": "Encode and Decode Strings", "question__article__slug": null, "total_submitted": 45333, "question__title_slug": "encode-and-decode-strings", "question__article__live": null, "question__hide": false, "question_id": 271}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 20552, "question__title": "Closest Binary Search Tree Value", "question__article__slug": null, "total_submitted": 55842, "question__title_slug": "closest-binary-search-tree-value", "question__article__live": null, "question__hide": false, "question_id": 270}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 14416, "question__title": "Alien Dictionary", "question__article__slug": null, "total_submitted": 59755, "question__title_slug": "alien-dictionary", "question__article__live": null, "question__hide": false, "question_id": 269}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 74901, "question__title": "Missing Number", "question__article__slug": null, "total_submitted": 175866, "question__title_slug": "missing-number", "question__article__live": null, "question__hide": false, "question_id": 268}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 8864, "question__title": "Palindrome Permutation II", "question__article__slug": null, "total_submitted": 29411, "question__title_slug": "palindrome-permutation-ii", "question__article__live": null, "question__hide": false, "question_id": 267}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 19549, "question__title": "Palindrome Permutation", "question__article__slug": null, "total_submitted": 36381, "question__title_slug": "palindrome-permutation", "question__article__live": null, "question__hide": false, "question_id": 266}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12286, "question__title": "Paint House II", "question__article__slug": null, "total_submitted": 33594, "question__title_slug": "paint-house-ii", "question__article__live": null, "question__hide": false, "question_id": 265}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 43587, "question__title": "Ugly Number II", "question__article__slug": null, "total_submitted": 141392, "question__title_slug": "ugly-number-ii", "question__article__live": null, "question__hide": false, "question_id": 264}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 78225, "question__title": "Ugly Number", "question__article__slug": null, "total_submitted": 205673, "question__title_slug": "ugly-number", "question__article__live": null, "question__hide": false, "question_id": 263}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 20785, "question__title": "Graph Valid Tree", "question__article__slug": null, "total_submitted": 59195, "question__title_slug": "graph-valid-tree", "question__article__live": null, "question__hide": false, "question_id": 261}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 50400, "question__title": "Single Number III", "question__article__slug": null, "total_submitted": 105241, "question__title_slug": "single-number-iii", "question__article__live": null, "question__hide": false, "question_id": 260}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15261, "question__title": "3Sum Smaller", "question__article__slug": "3sum-smaller", "total_submitted": 38289, "question__title_slug": "3sum-smaller", "question__article__live": true, "question__hide": false, "question_id": 259}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 131204, "question__title": "Add Digits", "question__article__slug": null, "total_submitted": 263317, "question__title_slug": "add-digits", "question__article__live": null, "question__hide": false, "question_id": 258}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 71794, "question__title": "Binary Tree Paths", "question__article__slug": null, "total_submitted": 218388, "question__title_slug": "binary-tree-paths", "question__article__live": null, "question__hide": false, "question_id": 257}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 13000, "question__title": "Paint House", "question__article__slug": null, "total_submitted": 28868, "question__title_slug": "paint-house", "question__article__live": null, "question__hide": false, "question_id": 256}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12788, "question__title": "Verify Preorder Sequence in Binary Search Tree", "question__article__slug": null, "total_submitted": 33636, "question__title_slug": "verify-preorder-sequence-in-binary-search-tree", "question__article__live": null, "question__hide": false, "question_id": 255}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 14560, "question__title": "Factor Combinations", "question__article__slug": null, "total_submitted": 37807, "question__title_slug": "factor-combinations", "question__article__live": null, "question__hide": false, "question_id": 254}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 19389, "question__title": "Meeting Rooms II", "question__article__slug": null, "total_submitted": 51950, "question__title_slug": "meeting-rooms-ii", "question__article__live": null, "question__hide": false, "question_id": 253}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 17458, "question__title": "Meeting Rooms", "question__article__slug": "meeting-rooms", "total_submitted": 39528, "question__title_slug": "meeting-rooms", "question__article__live": true, "question__hide": false, "question_id": 252}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15278, "question__title": "Flatten 2D Vector", "question__article__slug": null, "total_submitted": 41056, "question__title_slug": "flatten-2d-vector", "question__article__live": null, "question__hide": false, "question_id": 251}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 9970, "question__title": "Count Univalue Subtrees", "question__article__slug": null, "total_submitted": 25301, "question__title_slug": "count-univalue-subtrees", "question__article__live": null, "question__hide": false, "question_id": 250}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15519, "question__title": "Group Shifted Strings", "question__article__slug": null, "total_submitted": 42873, "question__title_slug": "group-shifted-strings", "question__article__live": null, "question__hide": false, "question_id": 249}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 6353, "question__title": "Strobogrammatic Number III", "question__article__slug": null, "total_submitted": 21503, "question__title_slug": "strobogrammatic-number-iii", "question__article__live": null, "question__hide": false, "question_id": 248}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 13500, "question__title": "Strobogrammatic Number II", "question__article__slug": null, "total_submitted": 36738, "question__title_slug": "strobogrammatic-number-ii", "question__article__live": null, "question__hide": false, "question_id": 247}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15782, "question__title": "Strobogrammatic Number", "question__article__slug": null, "total_submitted": 41536, "question__title_slug": "strobogrammatic-number", "question__article__live": null, "question__hide": false, "question_id": 246}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12208, "question__title": "Shortest Word Distance III", "question__article__slug": null, "total_submitted": 25272, "question__title_slug": "shortest-word-distance-iii", "question__article__live": null, "question__hide": false, "question_id": 245}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 12892, "question__title": "Shortest Word Distance II", "question__article__slug": null, "total_submitted": 36750, "question__title_slug": "shortest-word-distance-ii", "question__article__live": null, "question__hide": false, "question_id": 244}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 18292, "question__title": "Shortest Word Distance", "question__article__slug": "shortest-word-distance", "total_submitted": 36900, "question__title_slug": "shortest-word-distance", "question__article__live": true, "question__hide": false, "question_id": 243}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 115158, "question__title": "Valid Anagram", "question__article__slug": "valid-anagram", "total_submitted": 261648, "question__title_slug": "valid-anagram", "question__article__live": true, "question__hide": false, "question_id": 242}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 32012, "question__title": "Different Ways to Add Parentheses", "question__article__slug": null, "total_submitted": 80738, "question__title_slug": "different-ways-to-add-parentheses", "question__article__live": null, "question__hide": false, "question_id": 241}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 52799, "question__title": "Search a 2D Matrix II", "question__article__slug": null, "total_submitted": 142936, "question__title_slug": "search-a-2d-matrix-ii", "question__article__live": null, "question__hide": false, "question_id": 240}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 38981, "question__title": "Sliding Window Maximum", "question__article__slug": null, "total_submitted": 129152, "question__title_slug": "sliding-window-maximum", "question__article__live": null, "question__hide": false, "question_id": 239}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 66211, "question__title": "Product of Array Except Self", "question__article__slug": null, "total_submitted": 144793, "question__title_slug": "product-of-array-except-self", "question__article__live": null, "question__hide": false, "question_id": 238}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 112174, "question__title": "Delete Node in a Linked List", "question__article__slug": "delete-node-linked-list", "total_submitted": 249797, "question__title_slug": "delete-node-in-a-linked-list", "question__article__live": true, "question__hide": false, "question_id": 237}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 64250, "question__title": "Lowest Common Ancestor of a Binary Tree", "question__article__slug": null, "total_submitted": 219635, "question__title_slug": "lowest-common-ancestor-of-a-binary-tree", "question__article__live": null, "question__hide": false, "question_id": 236}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 98038, "question__title": "Lowest Common Ancestor of a Binary Search Tree", "question__article__slug": null, "total_submitted": 259708, "question__title_slug": "lowest-common-ancestor-of-a-binary-search-tree", "question__article__live": null, "question__hide": false, "question_id": 235}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 70593, "question__title": "Palindrome Linked List", "question__article__slug": null, "total_submitted": 229686, "question__title_slug": "palindrome-linked-list", "question__article__live": null, "question__hide": false, "question_id": 234}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 23757, "question__title": "Number of Digit One", "question__article__slug": null, "total_submitted": 89204, "question__title_slug": "number-of-digit-one", "question__article__live": null, "question__hide": false, "question_id": 233}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 60432, "question__title": "Implement Queue using Stacks", "question__article__slug": "implement-queue-using-stacks", "total_submitted": 174042, "question__title_slug": "implement-queue-using-stacks", "question__article__live": true, "question__hide": false, "question_id": 232}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 103502, "question__title": "Power of Two", "question__article__slug": null, "total_submitted": 267360, "question__title_slug": "power-of-two", "question__article__live": null, "question__hide": false, "question_id": 231}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 69014, "question__title": "Kth Smallest Element in a BST", "question__article__slug": null, "total_submitted": 168996, "question__title_slug": "kth-smallest-element-in-a-bst", "question__article__live": null, "question__hide": false, "question_id": 230}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 39877, "question__title": "Majority Element II", "question__article__slug": null, "total_submitted": 146651, "question__title_slug": "majority-element-ii", "question__article__live": null, "question__hide": false, "question_id": 229}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 59901, "question__title": "Summary Ranges", "question__article__slug": "summary-ranges", "total_submitted": 222752, "question__title_slug": "summary-ranges", "question__article__live": true, "question__hide": false, "question_id": 228}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 32726, "question__title": "Basic Calculator II", "question__article__slug": null, "total_submitted": 119748, "question__title_slug": "basic-calculator-ii", "question__article__live": null, "question__hide": false, "question_id": 227}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 127584, "question__title": "Invert Binary Tree", "question__article__slug": "invert-binary-tree", "total_submitted": 261954, "question__title_slug": "invert-binary-tree", "question__article__live": true, "question__hide": false, "question_id": 226}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 54151, "question__title": "Implement Stack using Queues", "question__article__slug": "implement-stack-using-queues", "total_submitted": 174765, "question__title_slug": "implement-stack-using-queues", "question__article__live": true, "question__hide": false, "question_id": 225}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 37064, "question__title": "Basic Calculator", "question__article__slug": null, "total_submitted": 151318, "question__title_slug": "basic-calculator", "question__article__live": null, "question__hide": false, "question_id": 224}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 49530, "question__title": "Rectangle Area", "question__article__slug": null, "total_submitted": 157879, "question__title_slug": "rectangle-area", "question__article__live": null, "question__hide": false, "question_id": 223}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 45945, "question__title": "Count Complete Tree Nodes", "question__article__slug": null, "total_submitted": 173001, "question__title_slug": "count-complete-tree-nodes", "question__article__live": null, "question__hide": false, "question_id": 222}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 42563, "question__title": "Maximal Square", "question__article__slug": "maximal-square", "total_submitted": 163559, "question__title_slug": "maximal-square", "question__article__live": true, "question__hide": false, "question_id": 221}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 39521, "question__title": "Contains Duplicate III", "question__article__slug": "contains-duplicate-iii", "total_submitted": 203654, "question__title_slug": "contains-duplicate-iii", "question__article__live": true, "question__hide": false, "question_id": 220}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 80608, "question__title": "Contains Duplicate II", "question__article__slug": "contains-duplicate-ii", "total_submitted": 259965, "question__title_slug": "contains-duplicate-ii", "question__article__live": true, "question__hide": false, "question_id": 219}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 26732, "question__title": "The Skyline Problem", "question__article__slug": null, "total_submitted": 108805, "question__title_slug": "the-skyline-problem", "question__article__live": null, "question__hide": false, "question_id": 218}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 121456, "question__title": "Contains Duplicate", "question__article__slug": "contains-duplicate", "total_submitted": 283738, "question__title_slug": "contains-duplicate", "question__article__live": true, "question__hide": false, "question_id": 217}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 47431, "question__title": "Combination Sum III", "question__article__slug": null, "total_submitted": 117908, "question__title_slug": "combination-sum-iii", "question__article__live": null, "question__hide": false, "question_id": 216}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 83703, "question__title": "Kth Largest Element in an Array", "question__article__slug": null, "total_submitted": 231246, "question__title_slug": "kth-largest-element-in-an-array", "question__article__live": null, "question__hide": false, "question_id": 215}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 28211, "question__title": "Shortest Palindrome", "question__article__slug": null, "total_submitted": 128274, "question__title_slug": "shortest-palindrome", "question__article__live": null, "question__hide": false, "question_id": 214}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 40954, "question__title": "House Robber II", "question__article__slug": null, "total_submitted": 125966, "question__title_slug": "house-robber-ii", "question__article__live": null, "question__hide": false, "question_id": 213}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 29954, "question__title": "Word Search II", "question__article__slug": null, "total_submitted": 139987, "question__title_slug": "word-search-ii", "question__article__live": null, "question__hide": false, "question_id": 212}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 35851, "question__title": "Add and Search Word - Data structure design", "question__article__slug": null, "total_submitted": 178025, "question__title_slug": "add-and-search-word-data-structure-design", "question__article__live": null, "question__hide": false, "question_id": 211}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 39643, "question__title": "Course Schedule II", "question__article__slug": null, "total_submitted": 166284, "question__title_slug": "course-schedule-ii", "question__article__live": null, "question__hide": false, "question_id": 210}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 55742, "question__title": "Minimum Size Subarray Sum", "question__article__slug": null, "total_submitted": 198645, "question__title_slug": "minimum-size-subarray-sum", "question__article__live": null, "question__hide": false, "question_id": 209}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 51200, "question__title": "Implement Trie (Prefix Tree)", "question__article__slug": "implement-trie-prefix-tree", "total_submitted": 200227, "question__title_slug": "implement-trie-prefix-tree", "question__article__live": true, "question__hide": false, "question_id": 208}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 56434, "question__title": "Course Schedule", "question__article__slug": null, "total_submitted": 191867, "question__title_slug": "course-schedule", "question__article__live": null, "question__hide": false, "question_id": 207}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 154036, "question__title": "Reverse Linked List", "question__article__slug": "reverse-linked-list", "total_submitted": 363712, "question__title_slug": "reverse-linked-list", "question__article__live": true, "question__hide": false, "question_id": 206}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 78160, "question__title": "Isomorphic Strings", "question__article__slug": null, "total_submitted": 246492, "question__title_slug": "isomorphic-strings", "question__article__live": null, "question__hide": false, "question_id": 205}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 85042, "question__title": "Count Primes", "question__article__slug": null, "total_submitted": 330313, "question__title_slug": "count-primes", "question__article__live": null, "question__hide": false, "question_id": 204}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 84510, "question__title": "Remove Linked List Elements", "question__article__slug": null, "total_submitted": 277759, "question__title_slug": "remove-linked-list-elements", "question__article__live": null, "question__hide": false, "question_id": 203}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 93699, "question__title": "Happy Number", "question__article__slug": null, "total_submitted": 243489, "question__title_slug": "happy-number", "question__article__live": null, "question__hide": false, "question_id": 202}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 44509, "question__title": "Bitwise AND of Numbers Range", "question__article__slug": null, "total_submitted": 136375, "question__title_slug": "bitwise-and-of-numbers-range", "question__article__live": null, "question__hide": false, "question_id": 201}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 67805, "question__title": "Number of Islands", "question__article__slug": null, "total_submitted": 220101, "question__title_slug": "number-of-islands", "question__article__live": null, "question__hide": false, "question_id": 200}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 57794, "question__title": "Binary Tree Right Side View", "question__article__slug": null, "total_submitted": 153627, "question__title_slug": "binary-tree-right-side-view", "question__article__live": null, "question__hide": false, "question_id": 199}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 97111, "question__title": "House Robber", "question__article__slug": "house-robber", "total_submitted": 265113, "question__title_slug": "house-robber", "question__article__live": true, "question__hide": false, "question_id": 198}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 117272, "question__title": "Number of 1 Bits", "question__article__slug": "number-1-bits", "total_submitted": 307734, "question__title_slug": "number-of-1-bits", "question__article__live": true, "question__hide": false, "question_id": 191}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 80391, "question__title": "Reverse Bits", "question__article__slug": null, "total_submitted": 272239, "question__title_slug": "reverse-bits", "question__article__live": null, "question__hide": false, "question_id": 190}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 95207, "question__title": "Rotate Array", "question__article__slug": "rotate-array", "total_submitted": 416451, "question__title_slug": "rotate-array", "question__article__live": true, "question__hide": false, "question_id": 189}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 34736, "question__title": "Best Time to Buy and Sell Stock IV", "question__article__slug": null, "total_submitted": 148176, "question__title_slug": "best-time-to-buy-and-sell-stock-iv", "question__article__live": null, "question__hide": false, "question_id": 188}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 57346, "question__title": "Repeated DNA Sequences", "question__article__slug": null, "total_submitted": 201906, "question__title_slug": "repeated-dna-sequences", "question__article__live": null, "question__hide": false, "question_id": 187}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15792, "question__title": "Reverse Words in a String II", "question__article__slug": null, "total_submitted": 54732, "question__title_slug": "reverse-words-in-a-string-ii", "question__article__live": null, "question__hide": false, "question_id": 186}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 58182, "question__title": "Largest Number", "question__article__slug": null, "total_submitted": 278966, "question__title_slug": "largest-number", "question__article__live": null, "question__hide": false, "question_id": 179}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 30774, "question__title": "Dungeon Game", "question__article__slug": null, "total_submitted": 137459, "question__title_slug": "dungeon-game", "question__article__live": null, "question__hide": false, "question_id": 174}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 64214, "question__title": "Binary Search Tree Iterator", "question__article__slug": null, "total_submitted": 171016, "question__title_slug": "binary-search-tree-iterator", "question__article__live": null, "question__hide": false, "question_id": 173}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 74142, "question__title": "Factorial Trailing Zeroes", "question__article__slug": null, "total_submitted": 216061, "question__title_slug": "factorial-trailing-zeroes", "question__article__live": null, "question__hide": false, "question_id": 172}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 102983, "question__title": "Excel Sheet Column Number", "question__article__slug": null, "total_submitted": 232202, "question__title_slug": "excel-sheet-column-number", "question__article__live": null, "question__hide": false, "question_id": 171}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 17661, "question__title": "Two Sum III - Data structure design", "question__article__slug": null, "total_submitted": 78220, "question__title_slug": "two-sum-iii-data-structure-design", "question__article__live": null, "question__hide": false, "question_id": 170}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 149276, "question__title": "Majority Element", "question__article__slug": null, "total_submitted": 340586, "question__title_slug": "majority-element", "question__article__live": null, "question__hide": false, "question_id": 169}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 78171, "question__title": "Excel Sheet Column Title", "question__article__slug": null, "total_submitted": 330368, "question__title_slug": "excel-sheet-column-title", "question__article__live": null, "question__hide": false, "question_id": 168}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 31765, "question__title": "Two Sum II - Input array is sorted", "question__article__slug": "two-sum-ii-input-array-sorted", "total_submitted": 66024, "question__title_slug": "two-sum-ii-input-array-is-sorted", "question__article__live": true, "question__hide": false, "question_id": 167}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 40025, "question__title": "Fraction to Recurring Decimal", "question__article__slug": "fraction-recurring-decimal", "total_submitted": 244352, "question__title_slug": "fraction-to-recurring-decimal", "question__article__live": true, "question__hide": false, "question_id": 166}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 68424, "question__title": "Compare Version Numbers", "question__article__slug": null, "total_submitted": 364143, "question__title_slug": "compare-version-numbers", "question__article__live": null, "question__hide": false, "question_id": 165}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 39000, "question__title": "Maximum Gap", "question__article__slug": null, "total_submitted": 138826, "question__title_slug": "maximum-gap", "question__article__live": null, "question__hide": false, "question_id": 164}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 18048, "question__title": "Missing Ranges", "question__article__slug": null, "total_submitted": 59684, "question__title_slug": "missing-ranges", "question__article__live": null, "question__hide": false, "question_id": 163}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 85382, "question__title": "Find Peak Element", "question__article__slug": null, "total_submitted": 244171, "question__title_slug": "find-peak-element", "question__article__live": null, "question__hide": false, "question_id": 162}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 19244, "question__title": "One Edit Distance", "question__article__slug": null, "total_submitted": 64767, "question__title_slug": "one-edit-distance", "question__article__live": null, "question__hide": false, "question_id": 161}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 95576, "question__title": "Intersection of Two Linked Lists", "question__article__slug": "intersection-two-linked-lists", "total_submitted": 313492, "question__title_slug": "intersection-of-two-linked-lists", "question__article__live": true, "question__hide": false, "question_id": 160}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 17602, "question__title": "Longest Substring with At Most Two Distinct Characters", "question__article__slug": null, "total_submitted": 46184, "question__title_slug": "longest-substring-with-at-most-two-distinct-characters", "question__article__live": null, "question__hide": false, "question_id": 159}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 15015, "question__title": "Read N Characters Given Read4 II - Call multiple times", "question__article__slug": null, "total_submitted": 61890, "question__title_slug": "read-n-characters-given-read4-ii-call-multiple-times", "question__article__live": null, "question__hide": false, "question_id": 158}, "is_favor": false, "paid_only": true, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 18699, "question__title": "Read N Characters Given Read4", "question__article__slug": null, "total_submitted": 63534, "question__title_slug": "read-n-characters-given-read4", "question__article__live": null, "question__hide": false, "question_id": 157}, "is_favor": false, "paid_only": true, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 16179, "question__title": "Binary Tree Upside Down", "question__article__slug": null, "total_submitted": 39448, "question__title_slug": "binary-tree-upside-down", "question__article__live": null, "question__hide": false, "question_id": 156}, "is_favor": false, "paid_only": true, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 94641, "question__title": "Min Stack", "question__article__slug": null, "total_submitted": 378119, "question__title_slug": "min-stack", "question__article__live": null, "question__hide": false, "question_id": 155}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 62703, "question__title": "Find Minimum in Rotated Sorted Array II", "question__article__slug": null, "total_submitted": 175665, "question__title_slug": "find-minimum-in-rotated-sorted-array-ii", "question__article__live": null, "question__hide": false, "question_id": 154}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 115860, "question__title": "Find Minimum in Rotated Sorted Array", "question__article__slug": null, "total_submitted": 305160, "question__title_slug": "find-minimum-in-rotated-sorted-array", "question__article__live": null, "question__hide": false, "question_id": 153}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 75508, "question__title": "Maximum Product Subarray", "question__article__slug": null, "total_submitted": 317741, "question__title_slug": "maximum-product-subarray", "question__article__live": null, "question__hide": false, "question_id": 152}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 123792, "question__title": "Reverse Words in a String", "question__article__slug": null, "total_submitted": 786654, "question__title_slug": "reverse-words-in-a-string", "question__article__live": null, "question__hide": false, "question_id": 151}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 76164, "question__title": "Evaluate Reverse Polish Notation", "question__article__slug": null, "total_submitted": 302174, "question__title_slug": "evaluate-reverse-polish-notation", "question__article__live": null, "question__hide": false, "question_id": 150}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 67103, "question__title": "Max Points on a Line", "question__article__slug": null, "total_submitted": 441951, "question__title_slug": "max-points-on-a-line", "question__article__live": null, "question__hide": false, "question_id": 149}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 85011, "question__title": "Sort List", "question__article__slug": null, "total_submitted": 319432, "question__title_slug": "sort-list", "question__article__live": null, "question__hide": false, "question_id": 148}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 84159, "question__title": "Insertion Sort List", "question__article__slug": null, "total_submitted": 270546, "question__title_slug": "insertion-sort-list", "question__article__live": null, "question__hide": false, "question_id": 147}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 92493, "question__title": "LRU Cache", "question__article__slug": null, "total_submitted": 584089, "question__title_slug": "lru-cache", "question__article__live": null, "question__hide": false, "question_id": 146}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 115664, "question__title": "Binary Tree Postorder Traversal", "question__article__slug": null, "total_submitted": 308408, "question__title_slug": "binary-tree-postorder-traversal", "question__article__live": null, "question__hide": false, "question_id": 145}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 146232, "question__title": "Binary Tree Preorder Traversal", "question__article__slug": null, "total_submitted": 346982, "question__title_slug": "binary-tree-preorder-traversal", "question__article__live": null, "question__hide": false, "question_id": 144}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 76715, "question__title": "Reorder List", "question__article__slug": null, "total_submitted": 317738, "question__title_slug": "reorder-list", "question__article__live": null, "question__hide": false, "question_id": 143}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 91284, "question__title": "Linked List Cycle II", "question__article__slug": null, "total_submitted": 292250, "question__title_slug": "linked-list-cycle-ii", "question__article__live": null, "question__hide": false, "question_id": 142}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 136216, "question__title": "Linked List Cycle", "question__article__slug": "linked-list-cycle", "total_submitted": 376783, "question__title_slug": "linked-list-cycle", "question__article__live": true, "question__hide": false, "question_id": 141}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 69045, "question__title": "Word Break II", "question__article__slug": null, "total_submitted": 323078, "question__title_slug": "word-break-ii", "question__article__live": null, "question__hide": false, "question_id": 140}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 108424, "question__title": "Word Break", "question__article__slug": null, "total_submitted": 399052, "question__title_slug": "word-break", "question__article__live": null, "question__hide": false, "question_id": 139}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 79563, "question__title": "Copy List with Random Pointer", "question__article__slug": null, "total_submitted": 303200, "question__title_slug": "copy-list-with-random-pointer", "question__article__live": null, "question__hide": false, "question_id": 138}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 99340, "question__title": "Single Number II", "question__article__slug": null, "total_submitted": 251427, "question__title_slug": "single-number-ii", "question__article__live": null, "question__hide": false, "question_id": 137}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 164193, "question__title": "Single Number", "question__article__slug": null, "total_submitted": 315933, "question__title_slug": "single-number", "question__article__live": null, "question__hide": false, "question_id": 136}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 59501, "question__title": "Candy", "question__article__slug": null, "total_submitted": 252881, "question__title_slug": "candy", "question__article__live": null, "question__hide": false, "question_id": 135}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 71472, "question__title": "Gas Station", "question__article__slug": null, "total_submitted": 253083, "question__title_slug": "gas-station", "question__article__live": null, "question__hide": false, "question_id": 134}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 83418, "question__title": "Clone Graph", "question__article__slug": null, "total_submitted": 334709, "question__title_slug": "clone-graph", "question__article__live": null, "question__hide": false, "question_id": 133}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 59242, "question__title": "Palindrome Partitioning II", "question__article__slug": null, "total_submitted": 257732, "question__title_slug": "palindrome-partitioning-ii", "question__article__live": null, "question__hide": false, "question_id": 132}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 77595, "question__title": "Palindrome Partitioning", "question__article__slug": null, "total_submitted": 260824, "question__title_slug": "palindrome-partitioning", "question__article__live": null, "question__hide": false, "question_id": 131}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 65333, "question__title": "Surrounded Regions", "question__article__slug": null, "total_submitted": 383676, "question__title_slug": "surrounded-regions", "question__article__live": null, "question__hide": false, "question_id": 130}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 91532, "question__title": "Sum Root to Leaf Numbers", "question__article__slug": null, "total_submitted": 265649, "question__title_slug": "sum-root-to-leaf-numbers", "question__article__live": null, "question__hide": false, "question_id": 129}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 80334, "question__title": "Longest Consecutive Sequence", "question__article__slug": null, "total_submitted": 234230, "question__title_slug": "longest-consecutive-sequence", "question__article__live": null, "question__hide": false, "question_id": 128}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 94352, "question__title": "Word Ladder", "question__article__slug": null, "total_submitted": 485661, "question__title_slug": "word-ladder", "question__article__live": null, "question__hide": false, "question_id": 127}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 53771, "question__title": "Word Ladder II", "question__article__slug": null, "total_submitted": 392808, "question__title_slug": "word-ladder-ii", "question__article__live": null, "question__hide": false, "question_id": 126}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 124272, "question__title": "Valid Palindrome", "question__article__slug": null, "total_submitted": 499420, "question__title_slug": "valid-palindrome", "question__article__live": null, "question__hide": false, "question_id": 125}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 77433, "question__title": "Binary Tree Maximum Path Sum", "question__article__slug": null, "total_submitted": 315795, "question__title_slug": "binary-tree-maximum-path-sum", "question__article__live": null, "question__hide": false, "question_id": 124}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 69279, "question__title": "Best Time to Buy and Sell Stock III", "question__article__slug": null, "total_submitted": 250177, "question__title_slug": "best-time-to-buy-and-sell-stock-iii", "question__article__live": null, "question__hide": false, "question_id": 123}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 108249, "question__title": "Best Time to Buy and Sell Stock II", "question__article__slug": "best-time-buy-and-sell-stock-ii", "total_submitted": 242838, "question__title_slug": "best-time-to-buy-and-sell-stock-ii", "question__article__live": true, "question__hide": false, "question_id": 122}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 137109, "question__title": "Best Time to Buy and Sell Stock", "question__article__slug": "best-time-buy-and-sell-stock", "total_submitted": 359679, "question__title_slug": "best-time-to-buy-and-sell-stock", "question__article__live": true, "question__hide": false, "question_id": 121}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 84452, "question__title": "Triangle", "question__article__slug": null, "total_submitted": 265212, "question__title_slug": "triangle", "question__article__live": null, "question__hide": false, "question_id": 120}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 91959, "question__title": "Pascal's Triangle II", "question__article__slug": null, "total_submitted": 268795, "question__title_slug": "pascals-triangle-ii", "question__article__live": null, "question__hide": false, "question_id": 119}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 103552, "question__title": "Pascal's Triangle", "question__article__slug": null, "total_submitted": 289898, "question__title_slug": "pascals-triangle", "question__article__live": null, "question__hide": false, "question_id": 118}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 73711, "question__title": "Populating Next Right Pointers in Each Node II", "question__article__slug": null, "total_submitted": 222151, "question__title_slug": "populating-next-right-pointers-in-each-node-ii", "question__article__live": null, "question__hide": false, "question_id": 117}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 105591, "question__title": "Populating Next Right Pointers in Each Node", "question__article__slug": null, "total_submitted": 287477, "question__title_slug": "populating-next-right-pointers-in-each-node", "question__article__live": null, "question__hide": false, "question_id": 116}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 59616, "question__title": "Distinct Subsequences", "question__article__slug": null, "total_submitted": 197633, "question__title_slug": "distinct-subsequences", "question__article__live": null, "question__hide": false, "question_id": 115}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 100075, "question__title": "Flatten Binary Tree to Linked List", "question__article__slug": null, "total_submitted": 305000, "question__title_slug": "flatten-binary-tree-to-linked-list", "question__article__live": null, "question__hide": false, "question_id": 114}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 99021, "question__title": "Path Sum II", "question__article__slug": null, "total_submitted": 326227, "question__title_slug": "path-sum-ii", "question__article__live": null, "question__hide": false, "question_id": 113}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 126966, "question__title": "Path Sum", "question__article__slug": null, "total_submitted": 391919, "question__title_slug": "path-sum", "question__article__live": null, "question__hide": false, "question_id": 112}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 131501, "question__title": "Minimum Depth of Binary Tree", "question__article__slug": null, "total_submitted": 413479, "question__title_slug": "minimum-depth-of-binary-tree", "question__article__live": null, "question__hide": false, "question_id": 111}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 137271, "question__title": "Balanced Binary Tree", "question__article__slug": null, "total_submitted": 385417, "question__title_slug": "balanced-binary-tree", "question__article__live": null, "question__hide": false, "question_id": 110}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 85036, "question__title": "Convert Sorted List to Binary Search Tree", "question__article__slug": null, "total_submitted": 265131, "question__title_slug": "convert-sorted-list-to-binary-search-tree", "question__article__live": null, "question__hide": false, "question_id": 109}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 92583, "question__title": "Convert Sorted Array to Binary Search Tree", "question__article__slug": null, "total_submitted": 234146, "question__title_slug": "convert-sorted-array-to-binary-search-tree", "question__article__live": null, "question__hide": false, "question_id": 108}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 100466, "question__title": "Binary Tree Level Order Traversal II", "question__article__slug": null, "total_submitted": 274518, "question__title_slug": "binary-tree-level-order-traversal-ii", "question__article__live": null, "question__hide": false, "question_id": 107}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 67790, "question__title": "Construct Binary Tree from Inorder and Postorder Traversal", "question__article__slug": null, "total_submitted": 222765, "question__title_slug": "construct-binary-tree-from-inorder-and-postorder-traversal", "question__article__live": null, "question__hide": false, "question_id": 106}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 78940, "question__title": "Construct Binary Tree from Preorder and Inorder Traversal", "question__article__slug": null, "total_submitted": 261392, "question__title_slug": "construct-binary-tree-from-preorder-and-inorder-traversal", "question__article__live": null, "question__hide": false, "question_id": 105}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 184665, "question__title": "Maximum Depth of Binary Tree", "question__article__slug": null, "total_submitted": 369734, "question__title_slug": "maximum-depth-of-binary-tree", "question__article__live": null, "question__hide": false, "question_id": 104}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 75845, "question__title": "Binary Tree Zigzag Level Order Traversal", "question__article__slug": null, "total_submitted": 243985, "question__title_slug": "binary-tree-zigzag-level-order-traversal", "question__article__live": null, "question__hide": false, "question_id": 103}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 130336, "question__title": "Binary Tree Level Order Traversal", "question__article__slug": null, "total_submitted": 366024, "question__title_slug": "binary-tree-level-order-traversal", "question__article__live": null, "question__hide": false, "question_id": 102}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 135023, "question__title": "Symmetric Tree", "question__article__slug": "symmetric-tree", "total_submitted": 374585, "question__title_slug": "symmetric-tree", "question__article__live": true, "question__hide": false, "question_id": 101}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 160059, "question__title": "Same Tree", "question__article__slug": null, "total_submitted": 358479, "question__title_slug": "same-tree", "question__article__live": null, "question__hide": false, "question_id": 100}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 61350, "question__title": "Recover Binary Search Tree", "question__article__slug": null, "total_submitted": 218340, "question__title_slug": "recover-binary-search-tree", "question__article__live": null, "question__hide": false, "question_id": 99}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 118351, "question__title": "Validate Binary Search Tree", "question__article__slug": null, "total_submitted": 541371, "question__title_slug": "validate-binary-search-tree", "question__article__live": null, "question__hide": false, "question_id": 98}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 58640, "question__title": "Interleaving String", "question__article__slug": null, "total_submitted": 248656, "question__title_slug": "interleaving-string", "question__article__live": null, "question__hide": false, "question_id": 97}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 99021, "question__title": "Unique Binary Search Trees", "question__article__slug": null, "total_submitted": 253013, "question__title_slug": "unique-binary-search-trees", "question__article__live": null, "question__hide": false, "question_id": 96}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 67122, "question__title": "Unique Binary Search Trees II", "question__article__slug": null, "total_submitted": 223045, "question__title_slug": "unique-binary-search-trees-ii", "question__article__live": null, "question__hide": false, "question_id": 95}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 154451, "question__title": "Binary Tree Inorder Traversal", "question__article__slug": null, "total_submitted": 363731, "question__title_slug": "binary-tree-inorder-traversal", "question__article__live": null, "question__hide": false, "question_id": 94}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 68319, "question__title": "Restore IP Addresses", "question__article__slug": null, "total_submitted": 271741, "question__title_slug": "restore-ip-addresses", "question__article__live": null, "question__hide": false, "question_id": 93}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 87086, "question__title": "Reverse Linked List II", "question__article__slug": null, "total_submitted": 296938, "question__title_slug": "reverse-linked-list-ii", "question__article__live": null, "question__hide": false, "question_id": 92}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 88770, "question__title": "Decode Ways", "question__article__slug": null, "total_submitted": 482168, "question__title_slug": "decode-ways", "question__article__live": null, "question__hide": false, "question_id": 91}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 83791, "question__title": "Subsets II", "question__article__slug": null, "total_submitted": 255344, "question__title_slug": "subsets-ii", "question__article__live": null, "question__hide": false, "question_id": 90}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 72844, "question__title": "Gray Code", "question__article__slug": null, "total_submitted": 189053, "question__title_slug": "gray-code", "question__article__live": null, "question__hide": false, "question_id": 89}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 125021, "question__title": "Merge Sorted Array", "question__article__slug": null, "total_submitted": 403465, "question__title_slug": "merge-sorted-array", "question__article__live": null, "question__hide": false, "question_id": 88}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 53992, "question__title": "Scramble String", "question__article__slug": null, "total_submitted": 194241, "question__title_slug": "scramble-string", "question__article__live": null, "question__hide": false, "question_id": 87}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 79934, "question__title": "Partition List", "question__article__slug": null, "total_submitted": 257912, "question__title_slug": "partition-list", "question__article__live": null, "question__hide": false, "question_id": 86}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 51589, "question__title": "Maximal Rectangle", "question__article__slug": null, "total_submitted": 205375, "question__title_slug": "maximal-rectangle", "question__article__live": null, "question__hide": false, "question_id": 85}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 72574, "question__title": "Largest Rectangle in Histogram", "question__article__slug": null, "total_submitted": 287463, "question__title_slug": "largest-rectangle-in-histogram", "question__article__live": null, "question__hide": false, "question_id": 84}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 144415, "question__title": "Remove Duplicates from Sorted List", "question__article__slug": "remove-duplicates-sorted-list", "total_submitted": 377817, "question__title_slug": "remove-duplicates-from-sorted-list", "question__article__live": true, "question__hide": false, "question_id": 83}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 87747, "question__title": "Remove Duplicates from Sorted List II", "question__article__slug": null, "total_submitted": 311238, "question__title_slug": "remove-duplicates-from-sorted-list-ii", "question__article__live": null, "question__hide": false, "question_id": 82}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 75414, "question__title": "Search in Rotated Sorted Array II", "question__article__slug": null, "total_submitted": 230938, "question__title_slug": "search-in-rotated-sorted-array-ii", "question__article__live": null, "question__hide": false, "question_id": 81}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 92009, "question__title": "Remove Duplicates from Sorted Array II", "question__article__slug": null, "total_submitted": 268174, "question__title_slug": "remove-duplicates-from-sorted-array-ii", "question__article__live": null, "question__hide": false, "question_id": 80}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 94509, "question__title": "Word Search", "question__article__slug": null, "total_submitted": 383686, "question__title_slug": "word-search", "question__article__live": null, "question__hide": false, "question_id": 79}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 120856, "question__title": "Subsets", "question__article__slug": null, "total_submitted": 346253, "question__title_slug": "subsets", "question__article__live": null, "question__hide": false, "question_id": 78}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 93209, "question__title": "Combinations", "question__article__slug": null, "total_submitted": 252291, "question__title_slug": "combinations", "question__article__live": null, "question__hide": false, "question_id": 77}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 74887, "question__title": "Minimum Window Substring", "question__article__slug": null, "total_submitted": 327620, "question__title_slug": "minimum-window-substring", "question__article__live": null, "question__hide": false, "question_id": 76}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 122152, "question__title": "Sort Colors", "question__article__slug": null, "total_submitted": 338337, "question__title_slug": "sort-colors", "question__article__live": null, "question__hide": false, "question_id": 75}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 97367, "question__title": "Search a 2D Matrix", "question__article__slug": null, "total_submitted": 276591, "question__title_slug": "search-a-2d-matrix", "question__article__live": null, "question__hide": false, "question_id": 74}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 80538, "question__title": "Set Matrix Zeroes", "question__article__slug": null, "total_submitted": 232244, "question__title_slug": "set-matrix-zeroes", "question__article__live": null, "question__hide": false, "question_id": 73}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 70068, "question__title": "Edit Distance", "question__article__slug": null, "total_submitted": 233180, "question__title_slug": "edit-distance", "question__article__live": null, "question__hide": false, "question_id": 72}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 65150, "question__title": "Simplify Path", "question__article__slug": null, "total_submitted": 278128, "question__title_slug": "simplify-path", "question__article__live": null, "question__hide": false, "question_id": 71}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 135217, "question__title": "Climbing Stairs", "question__article__slug": null, "total_submitted": 355118, "question__title_slug": "climbing-stairs", "question__article__live": null, "question__hide": false, "question_id": 70}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 115220, "question__title": "Sqrt(x)", "question__article__slug": null, "total_submitted": 436232, "question__title_slug": "sqrtx", "question__article__live": null, "question__hide": false, "question_id": 69}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 41439, "question__title": "Text Justification", "question__article__slug": null, "total_submitted": 239125, "question__title_slug": "text-justification", "question__article__live": null, "question__hide": false, "question_id": 68}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 107666, "question__title": "Add Binary", "question__article__slug": null, "total_submitted": 364738, "question__title_slug": "add-binary", "question__article__live": null, "question__hide": false, "question_id": 67}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 129267, "question__title": "Plus One", "question__article__slug": null, "total_submitted": 359075, "question__title_slug": "plus-one", "question__article__live": null, "question__hide": false, "question_id": 66}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 55398, "question__title": "Valid Number", "question__article__slug": null, "total_submitted": 443853, "question__title_slug": "valid-number", "question__article__live": null, "question__hide": false, "question_id": 65}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 88061, "question__title": "Minimum Path Sum", "question__article__slug": null, "total_submitted": 240444, "question__title_slug": "minimum-path-sum", "question__article__live": null, "question__hide": false, "question_id": 64}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 81030, "question__title": "Unique Paths II", "question__article__slug": null, "total_submitted": 265836, "question__title_slug": "unique-paths-ii", "question__article__live": null, "question__hide": false, "question_id": 63}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 108101, "question__title": "Unique Paths", "question__article__slug": null, "total_submitted": 282244, "question__title_slug": "unique-paths", "question__article__live": null, "question__hide": false, "question_id": 62}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 85173, "question__title": "Rotate List", "question__article__slug": null, "total_submitted": 358563, "question__title_slug": "rotate-list", "question__article__live": null, "question__hide": false, "question_id": 61}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 66884, "question__title": "Permutation Sequence", "question__article__slug": null, "total_submitted": 252375, "question__title_slug": "permutation-sequence", "question__article__live": null, "question__hide": false, "question_id": 60}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 65213, "question__title": "Spiral Matrix II", "question__article__slug": null, "total_submitted": 175508, "question__title_slug": "spiral-matrix-ii", "question__article__live": null, "question__hide": false, "question_id": 59}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 114894, "question__title": "Length of Last Word", "question__article__slug": null, "total_submitted": 375022, "question__title_slug": "length-of-last-word", "question__article__live": null, "question__hide": false, "question_id": 58}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 71831, "question__title": "Insert Interval", "question__article__slug": null, "total_submitted": 282170, "question__title_slug": "insert-interval", "question__article__live": null, "question__hide": false, "question_id": 57}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 87148, "question__title": "Merge Intervals", "question__article__slug": null, "total_submitted": 318047, "question__title_slug": "merge-intervals", "question__article__live": null, "question__hide": false, "question_id": 56}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 96259, "question__title": "Jump Game", "question__article__slug": "jump-game", "total_submitted": 331805, "question__title_slug": "jump-game", "question__article__live": true, "question__hide": false, "question_id": 55}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 75708, "question__title": "Spiral Matrix", "question__article__slug": null, "total_submitted": 315605, "question__title_slug": "spiral-matrix", "question__article__live": null, "question__hide": false, "question_id": 54}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 141498, "question__title": "Maximum Subarray", "question__article__slug": null, "total_submitted": 371712, "question__title_slug": "maximum-subarray", "question__article__live": null, "question__hide": false, "question_id": 53}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 52243, "question__title": "N-Queens II", "question__article__slug": null, "total_submitted": 125154, "question__title_slug": "n-queens-ii", "question__article__live": null, "question__hide": false, "question_id": 52}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 64730, "question__title": "N-Queens", "question__article__slug": null, "total_submitted": 230431, "question__title_slug": "n-queens", "question__article__live": null, "question__hide": false, "question_id": 51}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 114134, "question__title": "Pow(x, n)", "question__article__slug": null, "total_submitted": 418402, "question__title_slug": "powx-n", "question__article__live": null, "question__hide": false, "question_id": 50}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 96992, "question__title": "Group Anagrams", "question__article__slug": null, "total_submitted": 318122, "question__title_slug": "anagrams", "question__article__live": null, "question__hide": false, "question_id": 49}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 83982, "question__title": "Rotate Image", "question__article__slug": null, "total_submitted": 230735, "question__title_slug": "rotate-image", "question__article__live": null, "question__hide": false, "question_id": 48}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 90256, "question__title": "Permutations II", "question__article__slug": null, "total_submitted": 300631, "question__title_slug": "permutations-ii", "question__article__live": null, "question__hide": false, "question_id": 47}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 125244, "question__title": "Permutations", "question__article__slug": null, "total_submitted": 322034, "question__title_slug": "permutations", "question__article__live": null, "question__hide": false, "question_id": 46}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 75948, "question__title": "Jump Game II", "question__article__slug": null, "total_submitted": 293760, "question__title_slug": "jump-game-ii", "question__article__live": null, "question__hide": false, "question_id": 45}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 71640, "question__title": "Wildcard Matching", "question__article__slug": null, "total_submitted": 386618, "question__title_slug": "wildcard-matching", "question__article__live": null, "question__hide": false, "question_id": 44}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 77646, "question__title": "Multiply Strings", "question__article__slug": null, "total_submitted": 308207, "question__title_slug": "multiply-strings", "question__article__live": null, "question__hide": false, "question_id": 43}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 84471, "question__title": "Trapping Rain Water", "question__article__slug": null, "total_submitted": 245991, "question__title_slug": "trapping-rain-water", "question__article__live": null, "question__hide": false, "question_id": 42}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 77950, "question__title": "First Missing Positive", "question__article__slug": null, "total_submitted": 316286, "question__title_slug": "first-missing-positive", "question__article__live": null, "question__hide": false, "question_id": 41}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 86905, "question__title": "Combination Sum II", "question__article__slug": null, "total_submitted": 288697, "question__title_slug": "combination-sum-ii", "question__article__live": null, "question__hide": false, "question_id": 40}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 118559, "question__title": "Combination Sum", "question__article__slug": null, "total_submitted": 346084, "question__title_slug": "combination-sum", "question__article__live": null, "question__hide": false, "question_id": 39}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 102289, "question__title": "Count and Say", "question__article__slug": null, "total_submitted": 324944, "question__title_slug": "count-and-say", "question__article__live": null, "question__hide": false, "question_id": 38}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 59974, "question__title": "Sudoku Solver", "question__article__slug": null, "total_submitted": 221420, "question__title_slug": "sudoku-solver", "question__article__live": null, "question__hide": false, "question_id": 37}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 94223, "question__title": "Valid Sudoku", "question__article__slug": null, "total_submitted": 286116, "question__title_slug": "valid-sudoku", "question__article__live": null, "question__hide": false, "question_id": 36}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 127423, "question__title": "Search Insert Position", "question__article__slug": null, "total_submitted": 330671, "question__title_slug": "search-insert-position", "question__article__live": null, "question__hide": false, "question_id": 35}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 104116, "question__title": "Search for a Range", "question__article__slug": null, "total_submitted": 342476, "question__title_slug": "search-for-a-range", "question__article__live": null, "question__hide": false, "question_id": 34}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 126251, "question__title": "Search in Rotated Sorted Array", "question__article__slug": null, "total_submitted": 401904, "question__title_slug": "search-in-rotated-sorted-array", "question__article__live": null, "question__hide": false, "question_id": 33}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 76185, "question__title": "Longest Valid Parentheses", "question__article__slug": null, "total_submitted": 332622, "question__title_slug": "longest-valid-parentheses", "question__article__live": null, "question__hide": false, "question_id": 32}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 83908, "question__title": "Next Permutation", "question__article__slug": "next-permutation", "total_submitted": 302279, "question__title_slug": "next-permutation", "question__article__live": true, "question__hide": false, "question_id": 31}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 65445, "question__title": "Substring with Concatenation of All Words", "question__article__slug": null, "total_submitted": 304825, "question__title_slug": "substring-with-concatenation-of-all-words", "question__article__live": null, "question__hide": false, "question_id": 30}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 80732, "question__title": "Divide Two Integers", "question__article__slug": null, "total_submitted": 507534, "question__title_slug": "divide-two-integers", "question__article__live": null, "question__hide": false, "question_id": 29}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 134586, "question__title": "Implement strStr()", "question__article__slug": null, "total_submitted": 511330, "question__title_slug": "implement-strstr", "question__article__live": null, "question__hide": false, "question_id": 28}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 150401, "question__title": "Remove Element", "question__article__slug": "remove-element", "total_submitted": 417320, "question__title_slug": "remove-element", "question__article__live": true, "question__hide": false, "question_id": 27}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 166773, "question__title": "Remove Duplicates from Sorted Array", "question__article__slug": "remove-duplicates-sorted-array", "total_submitted": 478235, "question__title_slug": "remove-duplicates-from-sorted-array", "question__article__live": true, "question__hide": false, "question_id": 26}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 72635, "question__title": "Reverse Nodes in k-Group", "question__article__slug": null, "total_submitted": 249800, "question__title_slug": "reverse-nodes-in-k-group", "question__article__live": null, "question__hide": false, "question_id": 25}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 126795, "question__title": "Swap Nodes in Pairs", "question__article__slug": null, "total_submitted": 345673, "question__title_slug": "swap-nodes-in-pairs", "question__article__live": null, "question__hide": false, "question_id": 24}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 109510, "question__title": "Merge k Sorted Lists", "question__article__slug": null, "total_submitted": 435436, "question__title_slug": "merge-k-sorted-lists", "question__article__live": null, "question__hide": false, "question_id": 23}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 111050, "question__title": "Generate Parentheses", "question__article__slug": null, "total_submitted": 275395, "question__title_slug": "generate-parentheses", "question__article__live": null, "question__hide": false, "question_id": 22}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 162742, "question__title": "Merge Two Sorted Lists", "question__article__slug": null, "total_submitted": 437235, "question__title_slug": "merge-two-sorted-lists", "question__article__live": null, "question__hide": false, "question_id": 21}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 140141, "question__title": "Valid Parentheses", "question__article__slug": null, "total_submitted": 448539, "question__title_slug": "valid-parentheses", "question__article__live": null, "question__hide": false, "question_id": 20}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 137633, "question__title": "Remove Nth Node From End of List", "question__article__slug": "remove-nth-node-end-list", "total_submitted": 437460, "question__title_slug": "remove-nth-node-from-end-of-list", "question__article__live": true, "question__hide": false, "question_id": 19}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 90840, "question__title": "4Sum", "question__article__slug": null, "total_submitted": 361930, "question__title_slug": "4sum", "question__article__live": null, "question__hide": false, "question_id": 18}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 104549, "question__title": "Letter Combinations of a Phone Number", "question__article__slug": null, "total_submitted": 335203, "question__title_slug": "letter-combinations-of-a-phone-number", "question__article__live": null, "question__hide": false, "question_id": 17}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 97866, "question__title": "3Sum Closest", "question__article__slug": null, "total_submitted": 323716, "question__title_slug": "3sum-closest", "question__article__live": null, "question__hide": false, "question_id": 16}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 152473, "question__title": "3Sum", "question__article__slug": null, "total_submitted": 753521, "question__title_slug": "3sum", "question__article__live": null, "question__hide": false, "question_id": 15}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 128203, "question__title": "Longest Common Prefix", "question__article__slug": "longest-common-prefix", "total_submitted": 428430, "question__title_slug": "longest-common-prefix", "question__article__live": true, "question__hide": false, "question_id": 14}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 109692, "question__title": "Roman to Integer", "question__article__slug": null, "total_submitted": 258920, "question__title_slug": "roman-to-integer", "question__article__live": null, "question__hide": false, "question_id": 13}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 80501, "question__title": "Integer to Roman", "question__article__slug": null, "total_submitted": 192706, "question__title_slug": "integer-to-roman", "question__article__live": null, "question__hide": false, "question_id": 12}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 99169, "question__title": "Container With Most Water", "question__article__slug": "container-most-water", "total_submitted": 277201, "question__title_slug": "container-with-most-water", "question__article__live": true, "question__hide": false, "question_id": 11}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 102352, "question__title": "Regular Expression Matching", "question__article__slug": null, "total_submitted": 443718, "question__title_slug": "regular-expression-matching", "question__article__live": null, "question__hide": false, "question_id": 10}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 156636, "question__title": "Palindrome Number", "question__article__slug": null, "total_submitted": 468305, "question__title_slug": "palindrome-number", "question__article__live": null, "question__hide": false, "question_id": 9}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 129366, "question__title": "String to Integer (atoi)", "question__article__slug": null, "total_submitted": 939829, "question__title_slug": "string-to-integer-atoi", "question__article__live": null, "question__hide": false, "question_id": 8}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 175790, "question__title": "Reverse Integer", "question__article__slug": null, "total_submitted": 740802, "question__title_slug": "reverse-integer", "question__article__live": null, "question__hide": false, "question_id": 7}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 114782, "question__title": "ZigZag Conversion", "question__article__slug": null, "total_submitted": 450473, "question__title_slug": "zigzag-conversion", "question__article__live": null, "question__hide": false, "question_id": 6}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 140013, "question__title": "Longest Palindromic Substring", "question__article__slug": "longest-palindromic-substring", "total_submitted": 584606, "question__title_slug": "longest-palindromic-substring", "question__article__live": true, "question__hide": false, "question_id": 5}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 121930, "question__title": "Median of Two Sorted Arrays", "question__article__slug": null, "total_submitted": 603605, "question__title_slug": "median-of-two-sorted-arrays", "question__article__live": null, "question__hide": false, "question_id": 4}, "is_favor": false, "paid_only": false, "difficulty": {"level": 3}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 200495, "question__title": "Longest Substring Without Repeating Characters", "question__article__slug": "longest-substring-without-repeating-characters", "total_submitted": 860005, "question__title_slug": "longest-substring-without-repeating-characters", "question__article__live": true, "question__hide": false, "question_id": 3}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 195416, "question__title": "Add Two Numbers", "question__article__slug": "add-two-numbers", "total_submitted": 770201, "question__title_slug": "add-two-numbers", "question__article__live": true, "question__hide": false, "question_id": 2}, "is_favor": false, "paid_only": false, "difficulty": {"level": 2}, "frequency": 0, "progress": 0}, {"status": null, "stat": {"total_acs": 325728, "question__title": "Two Sum", "question__article__slug": "two-sum", "total_submitted": 1179185, "question__title_slug": "two-sum", "question__article__live": true, "question__hide": false, "question_id": 1}, "is_favor": false, "paid_only": false, "difficulty": {"level": 1}, "frequency": 0, "progress": 0}], "is_paid": false, "frequency_high": 0, "user_name": "", "num_total": 400}
\ No newline at end of file
diff --git a/test/mock/two-sum.submission.73790064.html.20161006 b/test/mock/two-sum.submission.73790064.html.20161006
new file mode 100644
index 00000000..66166b4c
--- /dev/null
+++ b/test/mock/two-sum.submission.73790064.html.20161006
@@ -0,0 +1,458 @@
+
+
+
+
+
+
+
Two Sum | Submission Detail | LeetCode OJ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Submission Details
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send Feedback
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/mock/two-sum.submissions.json.20170425 b/test/mock/two-sum.submissions.json.20170425
new file mode 100644
index 00000000..a9429801
--- /dev/null
+++ b/test/mock/two-sum.submissions.json.20170425
@@ -0,0 +1 @@
+{"has_next":true,"submissions_dump":[{"lang":"cpp","time":"1 month, 3 weeks","status_display":"Accepted","runtime":"12 ms","url":"/submissions/detail/95464136/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 1 week","status_display":"Accepted","runtime":"13 ms","url":"/submissions/detail/78502271/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Accepted","runtime":"9 ms","url":"/submissions/detail/77791021/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Compile Error","runtime":"N/A","url":"/submissions/detail/77790928/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Accepted","runtime":"13 ms","url":"/submissions/detail/77685402/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Wrong Answer","runtime":"N/A","url":"/submissions/detail/77685362/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Time Limit Exceeded","runtime":"N/A","url":"/submissions/detail/77685329/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Runtime Error","runtime":"N/A","url":"/submissions/detail/77685279/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Compile Error","runtime":"N/A","url":"/submissions/detail/77685195/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Wrong Answer","runtime":"N/A","url":"/submissions/detail/77685140/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Wrong Answer","runtime":"N/A","url":"/submissions/detail/77684623/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Compile Error","runtime":"N/A","url":"/submissions/detail/77684584/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Compile Error","runtime":"N/A","url":"/submissions/detail/77684436/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Time Limit Exceeded","runtime":"N/A","url":"/submissions/detail/77684406/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Runtime Error","runtime":"N/A","url":"/submissions/detail/77684353/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Runtime Error","runtime":"N/A","url":"/submissions/detail/77683773/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Runtime Error","runtime":"N/A","url":"/submissions/detail/77683680/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Runtime Error","runtime":"N/A","url":"/submissions/detail/77683411/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Compile Error","runtime":"N/A","url":"/submissions/detail/77683347/","is_pending":false,"title":"Two Sum"},{"lang":"cpp","time":"6 months, 2 weeks","status_display":"Time Limit Exceeded","runtime":"N/A","url":"/submissions/detail/77682978/","is_pending":false,"title":"Two Sum"}]}
diff --git a/test/plugins/test_cache.js b/test/plugins/test_cache.js
new file mode 100644
index 00000000..6b3114ca
--- /dev/null
+++ b/test/plugins/test_cache.js
@@ -0,0 +1,240 @@
+'use strict';
+const _ = require('underscore');
+const assert = require('chai').assert;
+const rewire = require('rewire');
+
+const h = require('../../lib/helper');
+const log = require('../../lib/log');
+const config = require('../../lib/config');
+const th = require('../helper');
+
+describe('plugin:cache', function() {
+ let plugin;
+ let next;
+ let cache;
+ let file;
+ let session;
+
+ const PROBLEMS = [
+ {id: 0, fid: 0, name: 'name0', slug: 'slug0', starred: false, category: 'algorithms'},
+ {id: 1, fid: 1, name: 'name1', slug: 'slug1', starred: true, category: 'algorithms'}
+ ];
+ const PROBLEM = {id: 0, fid: 0, slug: 'slug0', category: 'algorithms'};
+
+ before(function() {
+ log.init();
+ config.init();
+ });
+
+ beforeEach(function() {
+ th.clean();
+ next = {};
+
+ file = rewire('../../lib/file');
+ file.cacheDir = () => th.DIR;
+
+ cache = rewire('../../lib/cache');
+ cache.__set__('file', file);
+ cache.init();
+
+ session = rewire('../../lib/session');
+ session.__set__('cache', cache);
+
+ plugin = rewire('../../lib/plugins/cache');
+ plugin.__set__('cache', cache);
+ plugin.__set__('session', session);
+ plugin.init();
+
+ plugin.setNext(next);
+ });
+
+ describe('#getProblems', function() {
+ it('should getProblems w/ cache ok', function(done) {
+ cache.set('problems', PROBLEMS);
+
+ plugin.getProblems(function(e, problems) {
+ assert.equal(e, null);
+ assert.deepEqual(problems, PROBLEMS);
+ done();
+ });
+ });
+
+ it('should getProblems w/o cache ok', function(done) {
+ cache.del('problems');
+ next.getProblems = cb => cb(null, PROBLEMS);
+
+ plugin.getProblems(function(e, problems) {
+ assert.equal(e, null);
+ assert.deepEqual(problems, PROBLEMS);
+ done();
+ });
+ });
+
+ it('should getProblems w/o cache fail if client error', function(done) {
+ cache.del('problems');
+ next.getProblems = cb => cb('client getProblems error');
+
+ plugin.getProblems(function(e, problems) {
+ assert.equal(e, 'client getProblems error');
+ done();
+ });
+ });
+ }); // #getProblems
+
+ describe('#getProblem', function() {
+ it('should getProblem w/ cache ok', function(done) {
+ cache.set('problems', PROBLEMS);
+ cache.set('0.slug0.algorithms', PROBLEMS[0]);
+
+ plugin.getProblem(_.clone(PROBLEM), function(e, problem) {
+ assert.equal(e, null);
+ assert.deepEqual(problem, PROBLEMS[0]);
+ done();
+ });
+ });
+
+ it('should getProblem w/o cache ok', function(done) {
+ cache.set('problems', PROBLEMS);
+ cache.del('0.slug0.algorithms');
+ next.getProblem = (problem, cb) => cb(null, PROBLEMS[0]);
+
+ plugin.getProblem(_.clone(PROBLEM), function(e, problem) {
+ assert.equal(e, null);
+ assert.deepEqual(problem, PROBLEMS[0]);
+ done();
+ });
+ });
+
+ it('should getProblem fail if client error', function(done) {
+ cache.set('problems', PROBLEMS);
+ cache.del('0.slug0.algorithms');
+ next.getProblem = (problem, cb) => cb('client getProblem error');
+
+ plugin.getProblem(_.clone(PROBLEM), function(e, problem) {
+ assert.equal(e, 'client getProblem error');
+ done();
+ });
+ });
+ }); // #getProblem
+
+ describe('#saveProblem', function() {
+ it('should ok', function() {
+ cache.del('0.slug0.algorithms');
+
+ const problem = _.clone(PROBLEMS[0]);
+ problem.locked = true;
+ problem.state = 'ac';
+
+ const ret = plugin.saveProblem(problem);
+ assert.equal(ret, true);
+ assert.deepEqual(cache.get('0.slug0.algorithms'),
+ {id: 0, fid: 0, slug: 'slug0', name: 'name0', category: 'algorithms'});
+ });
+ }); // #saveProblem
+
+ describe('#updateProblem', function() {
+ it('should updateProblem ok', function(done) {
+ cache.set('problems', PROBLEMS);
+
+ const kv = {value: 'value00'};
+ const ret = plugin.updateProblem(PROBLEMS[0], kv);
+ assert.equal(ret, true);
+
+ plugin.getProblems(function(e, problems) {
+ assert.equal(e, null);
+ assert.deepEqual(problems, [
+ {id: 0, fid: 0, name: 'name0', slug: 'slug0', value: 'value00', starred: false, category: 'algorithms'},
+ {id: 1, fid: 1, name: 'name1', slug: 'slug1', starred: true, category: 'algorithms'}
+ ]);
+ done();
+ });
+ });
+
+ it('should updateProblem fail if no problems found', function() {
+ cache.del('problems');
+ const ret = plugin.updateProblem(PROBLEMS[0], {});
+ assert.equal(ret, false);
+ });
+
+ it('should updateProblem fail if unknown problem', function() {
+ cache.set('problems', [PROBLEMS[1]]);
+ const ret = plugin.updateProblem(PROBLEMS[0], {});
+ assert.equal(ret, false);
+ });
+ }); // #updateProblem
+
+ describe('#user', function() {
+ const USER = {name: 'test-user', pass: 'password'};
+ const USER_SAFE = {name: 'test-user'};
+
+ it('should login ok', function(done) {
+ config.autologin.enable = true;
+ // before login
+ cache.del(h.KEYS.user);
+ assert.equal(session.getUser(), null);
+ assert.equal(session.isLogin(), false);
+
+ next.login = (user, cb) => cb(null, user);
+
+ plugin.login(USER, function(e, user) {
+ assert.equal(e, null);
+ assert.deepEqual(user, USER);
+
+ // after login
+ assert.deepEqual(session.getUser(), USER);
+ assert.equal(session.isLogin(), true);
+ done();
+ });
+ });
+
+ it('should login ok w/ auto login', function(done) {
+ config.autologin.enable = false;
+ cache.del(h.KEYS.user);
+
+ next.login = (user, cb) => cb(null, user);
+
+ plugin.login(USER, function(e, user) {
+ assert.equal(e, null);
+ assert.deepEqual(user, USER);
+ assert.deepEqual(session.getUser(), USER_SAFE);
+ assert.equal(session.isLogin(), true);
+ done();
+ });
+ });
+
+ it('should login fail if client login error', function(done) {
+ next.login = (user, cb) => cb('client login error');
+
+ plugin.login(USER, function(e, user) {
+ assert.equal(e, 'client login error');
+ done();
+ });
+ });
+
+ it('should logout ok', function(done) {
+ // before logout
+ cache.set(h.KEYS.user, USER);
+ assert.deepEqual(session.getUser(), USER);
+ assert.equal(session.isLogin(), true);
+
+ // after logout
+ plugin.logout(USER, true);
+ assert.equal(session.getUser(), null);
+ assert.equal(session.isLogin(), false);
+ done();
+ });
+
+ it('should logout ok', function(done) {
+ // before logout
+ cache.set(h.KEYS.user, USER);
+ assert.deepEqual(session.getUser(), USER);
+ assert.equal(session.isLogin(), true);
+
+ // after logout
+ plugin.logout(null, true);
+ assert.equal(session.getUser(), null);
+ assert.equal(session.isLogin(), false);
+ done();
+ });
+ }); // #user
+});
diff --git a/test/plugins/test_leetcode.js b/test/plugins/test_leetcode.js
new file mode 100644
index 00000000..ef099b9b
--- /dev/null
+++ b/test/plugins/test_leetcode.js
@@ -0,0 +1,719 @@
+'use strict';
+const _ = require('underscore');
+const assert = require('chai').assert;
+const nock = require('nock');
+const rewire = require('rewire');
+
+const config = require('../../lib/config');
+const chalk = require('../../lib/chalk');
+const log = require('../../lib/log');
+
+const plugin = rewire('../../lib/plugins/leetcode');
+const session = rewire('../../lib/session');
+
+describe('plugin:leetcode', function() {
+ const USER = {hash: 'abcdef'};
+ const PROBLEM = {
+ id: 389,
+ name: 'Find the Difference',
+ slug: 'find-the-difference',
+ link: 'https://leetcode.com/problems/find-the-difference',
+ locked: false,
+ file: '/dev/null'
+ };
+ const SUBMISSION = {
+ id: '73790064',
+ lang: 'cpp',
+ runtime: '9 ms',
+ path: '/submissions/detail/73790064/',
+ state: 'Accepted'
+ };
+
+ before(function() {
+ log.init();
+ config.init();
+ chalk.init();
+ plugin.init();
+
+ session.getUser = () => USER;
+ session.saveUser = () => {};
+ plugin.__set__('session', session);
+ });
+
+ describe('#login', function() {
+ it('should ok', function(done) {
+ nock('https://leetcode.com')
+ .get('/accounts/login/')
+ .reply(200, '', { 'Set-Cookie': [
+ 'csrftoken=LOGIN_CSRF_TOKEN; Max-Age=31449600; Path=/; secure'
+ ]});
+
+ nock('https://leetcode.com')
+ .post('/accounts/login/')
+ .reply(302, '', {
+ 'Set-Cookie': [
+ 'csrftoken=SESSION_CSRF_TOKEN; Max-Age=31449600; Path=/; secure',
+ 'LEETCODE_SESSION=SESSION_ID; Max-Age=31449600; Path=/; secure'
+ ]});
+
+ nock('https://leetcode.com')
+ .get('/list/api/questions')
+ .reply(200, JSON.stringify({
+ user_name: 'Eric',
+ favorites: {
+ private_favorites: [{id_hash: 'abcdef', name: 'Favorite'}]
+ }
+ }));
+
+ plugin.login({}, function(e, user) {
+ assert.equal(e, null);
+
+ assert.equal(user.loginCSRF, 'LOGIN_CSRF_TOKEN');
+ assert.equal(user.sessionCSRF, 'SESSION_CSRF_TOKEN');
+ assert.equal(user.sessionId, 'SESSION_ID');
+ assert.equal(user.name, 'Eric');
+ assert.equal(user.hash, 'abcdef');
+ done();
+ });
+ });
+
+ it('should fail if http error', function(done) {
+ nock('https://leetcode.com')
+ .get('/accounts/login/')
+ .reply(200, '', {
+ 'Set-Cookie': [
+ 'csrftoken=LOGIN_CSRF_TOKEN; Max-Age=31449600; Path=/; secure'
+ ]});
+
+ nock('https://leetcode.com')
+ .post('/accounts/login/')
+ .replyWithError('unknown error!');
+
+ plugin.login({}, function(e, user) {
+ assert.equal(e.message, 'unknown error!');
+ done();
+ });
+ });
+
+ it('should fail if http error, 2nd', function(done) {
+ nock('https://leetcode.com')
+ .get('/accounts/login/')
+ .replyWithError('unknown error!');
+
+ plugin.login({}, function(e, user) {
+ assert.equal(e.message, 'unknown error!');
+ done();
+ });
+ });
+ }); // #login
+
+ describe('#getProblems', function() {
+ it('should ok', function(done) {
+ nock('https://leetcode.com')
+ .get('/api/problems/algorithms/')
+ .replyWithFile(200, './test/mock/problems.json.20160911');
+
+ nock('https://leetcode.com')
+ .get('/api/problems/database/')
+ .replyWithFile(200, './test/mock/problems.json.20160911');
+
+ nock('https://leetcode.com')
+ .get('/api/problems/shell/')
+ .replyWithFile(200, './test/mock/problems.json.20160911');
+
+ plugin.getProblems(function(e, problems) {
+ assert.equal(e, null);
+ assert.equal(problems.length, 377 * 3);
+ done();
+ });
+ });
+
+ it('should fail if error occurs', function(done) {
+ nock('https://leetcode.com')
+ .get('/api/problems/algorithms/')
+ .replyWithFile(200, './test/mock/problems.json.20160911');
+
+ nock('https://leetcode.com')
+ .get('/api/problems/database/')
+ .replyWithError('unknown error');
+
+ nock('https://leetcode.com')
+ .get('/api/problems/shell/')
+ .replyWithFile(200, './test/mock/problems.json.20160911');
+
+ plugin.getProblems(function(e, problems) {
+ assert.equal(e.message, 'unknown error');
+ done();
+ });
+ });
+ }); // #getProblems
+
+ describe('#getCategoryProblems', function() {
+ it('should ok', function(done) {
+ nock('https://leetcode.com')
+ .get('/api/problems/algorithms/')
+ .replyWithFile(200, './test/mock/problems.json.20160911');
+
+ plugin.getCategoryProblems('algorithms', function(e, problems) {
+ assert.equal(e, null);
+ assert.equal(problems.length, 377);
+ done();
+ });
+ });
+
+ it('should fail if not login', function(done) {
+ config.autologin.enable = false;
+ nock('https://leetcode.com')
+ .get('/api/problems/algorithms/')
+ .replyWithFile(200, './test/mock/problems.nologin.json.20161015');
+
+ plugin.getCategoryProblems('algorithms', function(e, problems) {
+ assert.deepEqual(e, session.errors.EXPIRED);
+ done();
+ });
+ });
+ }); // #getCategoryProblems
+
+ describe('#getProblem', function() {
+ beforeEach(function() {
+ PROBLEM.locked = false;
+ });
+
+ it('should ok', function(done) {
+ nock('https://leetcode.com')
+ .post('/graphql')
+ .replyWithFile(200, './test/mock/find-the-difference.json.20171216');
+
+ plugin.getProblem(PROBLEM, function(e, problem) {
+ assert.equal(e, null);
+ assert.equal(problem.totalAC, '89.7K');
+ assert.equal(problem.totalSubmit, '175.7K');
+ assert.equal(problem.desc,
+ [
+ '',
+ 'Given two strings s and t which consist of only lowercase letters.',
+ '',
+ 'String t is generated by random shuffling string s and then add one more letter at a random position.',
+ '',
+ 'Find the letter that was added in t.',
+ '',
+ 'Example:',
+ '',
+ 'Input:',
+ 's = "abcd"',
+ 't = "abcde"',
+ '',
+ 'Output:',
+ 'e',
+ '',
+ 'Explanation:',
+ "'e' is the letter that was added.",
+ ''
+ ].join('\r\n'));
+
+ assert.equal(problem.templates.length, 12);
+
+ assert.equal(problem.templates[0].value, 'cpp');
+ assert.equal(problem.templates[0].text, 'C++');
+ assert.equal(problem.templates[0].defaultCode,
+ [
+ 'class Solution {',
+ 'public:',
+ ' char findTheDifference(string s, string t) {',
+ ' ',
+ ' }',
+ '};'
+ ].join('\r\n'));
+
+ assert.equal(problem.templates[1].value, 'java');
+ assert.equal(problem.templates[1].text, 'Java');
+ assert.equal(problem.templates[1].defaultCode,
+ [
+ 'class Solution {',
+ ' public char findTheDifference(String s, String t) {',
+ ' ',
+ ' }',
+ '}'
+ ].join('\r\n'));
+
+ assert.equal(problem.templates[2].value, 'python');
+ assert.equal(problem.templates[2].text, 'Python');
+ assert.equal(problem.templates[2].defaultCode,
+ [
+ 'class Solution(object):',
+ ' def findTheDifference(self, s, t):',
+ ' """',
+ ' :type s: str',
+ ' :type t: str',
+ ' :rtype: str',
+ ' """',
+ ' '
+ ].join('\r\n'));
+
+ assert.equal(problem.templates[3].value, 'python3');
+ assert.equal(problem.templates[3].text, 'Python3');
+ assert.equal(problem.templates[3].defaultCode,
+ [
+ 'class Solution:',
+ ' def findTheDifference(self, s, t):',
+ ' """',
+ ' :type s: str',
+ ' :type t: str',
+ ' :rtype: str',
+ ' """',
+ ' '
+ ].join('\r\n'));
+
+ assert.equal(problem.templates[4].value, 'c');
+ assert.equal(problem.templates[4].text, 'C');
+ assert.equal(problem.templates[4].defaultCode,
+ [
+ 'char findTheDifference(char* s, char* t) {',
+ ' ',
+ '}'
+ ].join('\r\n'));
+
+ assert.equal(problem.templates[5].value, 'csharp');
+ assert.equal(problem.templates[5].text, 'C#');
+ assert.equal(problem.templates[5].defaultCode,
+ [
+ 'public class Solution {',
+ ' public char FindTheDifference(string s, string t) {',
+ ' ',
+ ' }',
+ '}'
+ ].join('\r\n'));
+
+ assert.equal(problem.templates[6].value, 'javascript');
+ assert.equal(problem.templates[6].text, 'JavaScript');
+ assert.equal(problem.templates[6].defaultCode,
+ [
+ '/**',
+ ' * @param {string} s',
+ ' * @param {string} t',
+ ' * @return {character}',
+ ' */',
+ 'var findTheDifference = function(s, t) {',
+ ' ',
+ '};'
+ ].join('\r\n'));
+
+ assert.equal(problem.templates[7].value, 'ruby');
+ assert.equal(problem.templates[7].text, 'Ruby');
+ assert.equal(problem.templates[7].defaultCode,
+ [
+ '# @param {String} s',
+ '# @param {String} t',
+ '# @return {Character}',
+ 'def find_the_difference(s, t)',
+ ' ',
+ 'end'
+ ].join('\r\n'));
+
+ assert.equal(problem.templates[8].value, 'swift');
+ assert.equal(problem.templates[8].text, 'Swift');
+ assert.equal(problem.templates[8].defaultCode,
+ [
+ 'class Solution {',
+ ' func findTheDifference(_ s: String, _ t: String) -> Character {',
+ ' ',
+ ' }',
+ '}'
+ ].join('\r\n'));
+
+ assert.equal(problem.templates[9].value, 'golang');
+ assert.equal(problem.templates[9].text, 'Go');
+ assert.equal(problem.templates[9].defaultCode,
+ [
+ 'func findTheDifference(s string, t string) byte {',
+ ' ',
+ '}'
+ ].join('\r\n'));
+
+ assert.equal(problem.templates[10].value, 'scala');
+ assert.equal(problem.templates[10].text, 'Scala');
+ assert.equal(problem.templates[10].defaultCode,
+ [
+ 'object Solution {',
+ ' def findTheDifference(s: String, t: String): Char = {',
+ ' ',
+ ' }',
+ '}'
+ ].join('\n'));
+
+ assert.equal(problem.templates[11].value, 'kotlin');
+ assert.equal(problem.templates[11].text, 'Kotlin');
+ assert.equal(problem.templates[11].defaultCode,
+ [
+ 'class Solution {',
+ ' fun findTheDifference(s: String, t: String): Char {',
+ ' ',
+ ' }',
+ '}'
+ ].join('\n'));
+
+ done();
+ });
+ });
+
+ it('should fail if no permission for locked', function(done) {
+ PROBLEM.locked = true;
+
+ plugin.getProblem(PROBLEM, function(e, problem) {
+ assert.equal(e, 'failed to load locked problem!');
+ done();
+ });
+ });
+
+ it('should fail if session expired', function(done) {
+ nock('https://leetcode.com').post('/graphql').reply(403);
+
+ plugin.getProblem(PROBLEM, function(e, problem) {
+ assert.equal(e, session.errors.EXPIRED);
+ done();
+ });
+ });
+
+ it('should fail if http error', function(done) {
+ nock('https://leetcode.com').post('/graphql').reply(500);
+
+ plugin.getProblem(PROBLEM, function(e, problem) {
+ assert.deepEqual(e, {msg: 'http error', statusCode: 500});
+ done();
+ });
+ });
+
+ it('should fail if unknown error', function(done) {
+ nock('https://leetcode.com').post('/graphql').replyWithError('unknown error!');
+
+ plugin.getProblem(PROBLEM, function(e, problem) {
+ assert.equal(e.message, 'unknown error!');
+ done();
+ });
+ });
+ }); // #getProblem
+
+ describe('#testProblem', function() {
+ it('should ok', function(done) {
+ nock('https://leetcode.com')
+ .post('/problems/find-the-difference/interpret_solution/')
+ .reply(200, '{"interpret_expected_id": "id1", "interpret_id": "id2"}');
+
+ nock('https://leetcode.com')
+ .get('/submissions/detail/id1/check/')
+ .reply(200, '{"state": "SUCCESS", "run_success": true, "status_code": 10}');
+
+ nock('https://leetcode.com')
+ .get('/submissions/detail/id2/check/')
+ .reply(200, '{"state": "SUCCESS", "run_success": false, "status_code": 15}');
+
+ plugin.testProblem(PROBLEM, function(e, results) {
+ assert.equal(e, null);
+ assert.equal(results[0].id, 'id2');
+ assert.equal(results[0].ok, false);
+ assert.equal(results[1].id, 'id1');
+ assert.equal(results[1].ok, true);
+ done();
+ });
+ });
+
+ it('should fail if http error', function(done) {
+ nock('https://leetcode.com')
+ .post('/problems/find-the-difference/interpret_solution/')
+ .replyWithError('unknown error!');
+
+ plugin.testProblem(PROBLEM, function(e, results) {
+ assert.equal(e.message, 'unknown error!');
+ done();
+ });
+ });
+ }); // #testProblem
+
+ describe('#submitProblem', function() {
+ it('should ok', function(done) {
+ nock('https://leetcode.com')
+ .post('/problems/find-the-difference/submit/')
+ .reply(200, '{"submission_id": "id1"}');
+
+ nock('https://leetcode.com')
+ .get('/submissions/detail/id1/check/')
+ .reply(200, '{"state": "SUCCESS", "run_success": true, "status_code": 10}');
+
+ plugin.submitProblem(PROBLEM, function(e, results) {
+ assert.equal(e, null);
+ assert.equal(results[0].id, 'id1');
+ assert.equal(results[0].ok, true);
+ done();
+ });
+ });
+
+ it('should ok after delay', function(done) {
+ nock('https://leetcode.com')
+ .post('/problems/find-the-difference/submit/')
+ .reply(200, '{"error": "You run code too soon"}');
+ nock('https://leetcode.com')
+ .post('/problems/find-the-difference/submit/')
+ .reply(200, '{"submission_id": "id1"}');
+
+ nock('https://leetcode.com')
+ .get('/submissions/detail/id1/check/')
+ .reply(200, '{"state": "STARTED"}');
+ nock('https://leetcode.com')
+ .get('/submissions/detail/id1/check/')
+ .reply(200, '{"state": "SUCCESS", "run_success": true, "status_code": 10}');
+
+ plugin.submitProblem(PROBLEM, function(e, results) {
+ assert.equal(e, null);
+ assert.equal(results[0].id, 'id1');
+ assert.equal(results[0].ok, true);
+ done();
+ });
+ }).timeout(5000);
+
+ it('should fail if server error', function(done) {
+ nock('https://leetcode.com')
+ .post('/problems/find-the-difference/submit/')
+ .reply(200, '{"error": "maybe internal error?"}');
+
+ plugin.submitProblem(PROBLEM, function(e, results) {
+ assert.equal(e, 'maybe internal error?');
+ done();
+ });
+ });
+
+ it('should fail if server error in check result', function(done) {
+ nock('https://leetcode.com')
+ .post('/problems/find-the-difference/submit/')
+ .reply(200, '{"submission_id": "id1"}');
+
+ nock('https://leetcode.com')
+ .get('/submissions/detail/id1/check/')
+ .replyWithError('unknown error!');
+
+ plugin.submitProblem(PROBLEM, function(e, results) {
+ assert.equal(e.message, 'unknown error!');
+ done();
+ });
+ });
+ }); // #submitProblem
+
+ describe('#starProblem', function() {
+ it('should star ok', function(done) {
+ nock('https://leetcode.com')
+ .post('/list/api/questions')
+ .reply(204, '');
+
+ plugin.starProblem(PROBLEM, true, function(e, starred) {
+ assert.equal(e, null);
+ assert.equal(starred, true);
+ done();
+ });
+ });
+
+ it('should unstar ok', function(done) {
+ nock('https://leetcode.com')
+ .delete('/list/api/questions/abcdef/389')
+ .reply(204, '');
+
+ plugin.starProblem(PROBLEM, false, function(e, starred) {
+ assert.equal(e, null);
+ assert.equal(starred, false);
+ done();
+ });
+ });
+
+ it('should star fail if http error', function(done) {
+ nock('https://leetcode.com')
+ .post('/list/api/questions')
+ .replyWithError('unknown error!');
+
+ plugin.starProblem(PROBLEM, true, function(e, starred) {
+ assert.equal(e.message, 'unknown error!');
+ done();
+ });
+ });
+ }); // #starProblem
+
+ describe('#getSubmissions', function() {
+ it('should ok', function(done) {
+ const problem = {
+ id: 1,
+ name: 'Two Sum',
+ slug: 'two-sum',
+ link: 'https://leetcode.com/problems/two-sum',
+ locked: false
+ };
+
+ nock('https://leetcode.com')
+ .get('/api/submissions/two-sum')
+ .replyWithFile(200, './test/mock/two-sum.submissions.json.20170425');
+
+ plugin.getSubmissions(problem, function(e, submissions) {
+ assert.equal(e, null);
+ assert.equal(submissions.length, 20);
+
+ assert.deepEqual(submissions[0], {
+ id: '95464136',
+ title: 'Two Sum',
+ is_pending: false,
+ lang: 'cpp',
+ time: '1 month, 3 weeks',
+ runtime: '12 ms',
+ url: '/submissions/detail/95464136/',
+ status_display: 'Accepted'
+ });
+
+ assert.deepEqual(submissions[1], {
+ id: '78502271',
+ title: 'Two Sum',
+ is_pending: false,
+ lang: 'cpp',
+ time: '6 months, 1 week',
+ runtime: '13 ms',
+ url: '/submissions/detail/78502271/',
+ status_display: 'Accepted'
+ });
+ done();
+ });
+ });
+
+ it('should fail if http error', function(done) {
+ nock('https://leetcode.com')
+ .get('/api/submissions/find-the-difference')
+ .replyWithError('unknown error!');
+
+ plugin.getSubmissions(PROBLEM, function(e, submissions) {
+ assert.equal(e.message, 'unknown error!');
+ done();
+ });
+ });
+ }); // #getSubmissions
+
+ describe('#getSubmission', function() {
+ it('should ok', function(done) {
+ nock('https://leetcode.com')
+ .get('/submissions/detail/73790064/')
+ .replyWithFile(200, './test/mock/two-sum.submission.73790064.html.20161006');
+
+ plugin.getSubmission(_.clone(SUBMISSION), function(e, submission) {
+ assert.equal(e, null);
+ assert.deepEqual(submission.code,
+ [
+ 'class Solution {',
+ 'public:',
+ ' vector
twoSum(vector& nums, int target) {',
+ ' return res;',
+ ' }',
+ '};',
+ ''
+ ].join('\r\n'));
+ done();
+ });
+ });
+
+ it('should fail if http error', function(done) {
+ nock('https://leetcode.com')
+ .get('/submissions/detail/73790064/')
+ .replyWithError('unknown error!');
+
+ plugin.getSubmission(_.clone(SUBMISSION), function(e, submission) {
+ assert.equal(e.message, 'unknown error!');
+ done();
+ });
+ });
+
+ it('should fail if no matching submission', function(done) {
+ nock('https://leetcode.com')
+ .get('/submissions/detail/73790064/')
+ .replyWithFile(200, './test/mock/locked.html.20161015');
+
+ plugin.getSubmission(_.clone(SUBMISSION), function(e, submission) {
+ assert.equal(e, null);
+ assert.equal(submission.code, null);
+ done();
+ });
+ });
+ }); // #getSubmission
+
+ describe('#getFavorites', function() {
+ it('should ok', function(done) {
+ nock('https://leetcode.com')
+ .get('/list/api/questions')
+ .replyWithFile(200, './test/mock/favorites.json.20170716');
+
+ plugin.getFavorites(function(e, favorites) {
+ assert.equal(e, null);
+
+ const my = favorites.favorites.private_favorites;
+ assert.equal(my.length, 1);
+ assert.equal(my[0].name, 'Favorite');
+ assert.equal(my[0].id_hash, 'abcdefg');
+ done();
+ });
+ });
+ }); // #getFavorites
+
+ describe('#session', function() {
+ const DATA = {sessions: []};
+
+ it('should getSessions ok', function(done) {
+ nock('https://leetcode.com')
+ .post('/session/')
+ .reply(200, JSON.stringify(DATA));
+
+ plugin.getSessions(function(e, sessions) {
+ assert.notExists(e);
+ assert.deepEqual(sessions, []);
+ done();
+ });
+ });
+
+ it('should activateSessions ok', function(done) {
+ nock('https://leetcode.com')
+ .put('/session/', {func: 'activate', target: 1})
+ .reply(200, JSON.stringify(DATA));
+
+ plugin.activateSession({id: 1}, function(e, sessions) {
+ assert.notExists(e);
+ assert.deepEqual(sessions, []);
+ done();
+ });
+ });
+
+ it('should createSessions ok', function(done) {
+ nock('https://leetcode.com')
+ .put('/session/', {func: 'create', name: 's1'})
+ .reply(200, JSON.stringify(DATA));
+
+ plugin.createSession('s1', function(e, sessions) {
+ assert.notExists(e);
+ assert.deepEqual(sessions, []);
+ done();
+ });
+ });
+
+ it('should deleteSessions ok', function(done) {
+ nock('https://leetcode.com')
+ .delete('/session/', {target: 1})
+ .reply(200, JSON.stringify(DATA));
+
+ plugin.deleteSession({id: 1}, function(e, sessions) {
+ assert.notExists(e);
+ assert.deepEqual(sessions, []);
+ done();
+ });
+ });
+
+ it('should fail if 302 returned', function(done) {
+ nock('https://leetcode.com')
+ .post('/session/')
+ .reply(302);
+
+ plugin.getSessions(function(e, sessions) {
+ assert.deepEqual(e, session.errors.EXPIRED);
+ assert.notExists(sessions);
+ done();
+ });
+ });
+ }); // #session
+});
diff --git a/test/plugins/test_retry.js b/test/plugins/test_retry.js
new file mode 100644
index 00000000..dbdb060c
--- /dev/null
+++ b/test/plugins/test_retry.js
@@ -0,0 +1,98 @@
+'use strict';
+const assert = require('chai').assert;
+const rewire = require('rewire');
+
+const log = require('../../lib/log');
+
+const config = rewire('../../lib/config');
+const session = rewire('../../lib/session');
+const plugin = rewire('../../lib/plugins/retry');
+
+describe('plugin:retry', function() {
+ const USER = {};
+ const NEXT = {};
+ const PROBLEMS = [{id: 0, name: 'name0'}];
+
+ before(function() {
+ log.init();
+ config.init();
+ plugin.init();
+
+ session.getUser = () => USER;
+
+ plugin.__set__('config', config);
+ plugin.__set__('session', session);
+ plugin.setNext(NEXT);
+ });
+
+ it('should fail if auto login disabled', function(done) {
+ config.autologin.enable = false;
+ NEXT.getProblems = cb => cb(session.errors.EXPIRED);
+
+ plugin.getProblems(function(e, problems) {
+ assert.equal(e, session.errors.EXPIRED);
+ done();
+ });
+ });
+
+ it('should retry ok if finally ok', function(done) {
+ config.autologin.enable = true;
+ config.autologin.retry = 3;
+
+ let n = 0;
+ NEXT.getProblems = function(cb) {
+ return ++n <= 3 ? cb(session.errors.EXPIRED) : cb(null, PROBLEMS);
+ };
+ NEXT.login = (user, cb) => cb(null, user);
+
+ plugin.getProblems(function(e, problems) {
+ assert.notExists(e);
+ assert.equal(problems, PROBLEMS);
+ done();
+ });
+ });
+
+ it('should retry fail if always failed', function(done) {
+ config.autologin.enable = true;
+ config.autologin.retry = 2;
+
+ let n = 0;
+ NEXT.getProblems = function(cb) {
+ return ++n <= 3 ? cb(session.errors.EXPIRED) : cb(null, PROBLEMS);
+ };
+ NEXT.login = (user, cb) => {
+ return n == 1 ? cb(null, user) : cb('login failed');
+ }
+
+ plugin.getProblems(function(e) {
+ assert.deepEqual(e, session.errors.EXPIRED);
+ done();
+ });
+ });
+
+ it('should fail if user expired locally', function(done) {
+ config.autologin.enable = true;
+
+ let n = 0;
+ NEXT.getProblems = function(cb) {
+ return ++n === 1 ? cb(session.errors.EXPIRED) : cb(null, PROBLEMS);
+ };
+ session.getUser = () => null;
+
+ plugin.getProblems(function(e, problems) {
+ assert.notExists(e);
+ assert.equal(problems, PROBLEMS);
+ done();
+ });
+ });
+
+ it('should fail if other errors', function(done) {
+ config.autologin.enable = true;
+ NEXT.getProblems = cb => cb('unknown error');
+
+ plugin.getProblems(function(e, problems) {
+ assert.equal(e, 'unknown error');
+ done();
+ });
+ });
+});
diff --git a/test/test_cache.js b/test/test_cache.js
index f3d75dae..caba14c1 100644
--- a/test/test_cache.js
+++ b/test/test_cache.js
@@ -1,22 +1,48 @@
-var assert = require('chai').assert;
+'use strict';
+const assert = require('chai').assert;
+const rewire = require('rewire');
-var cache = require('../lib/cache');
+const th = require('./helper');
describe('cache', function() {
- var k = '.test';
- var v = {test: 'data'};
+ let cache;
- it('should ok when not cached', function() {
- cache.del(k);
+ const K = '.test';
+ const V = {test: 'data'};
- assert.equal(cache.get(k), null);
- assert.equal(cache.del(k), false);
+ beforeEach(function() {
+ th.clean();
+
+ const file = rewire('../lib/file');
+ file.cacheDir = () => th.DIR;
+
+ cache = rewire('../lib/cache');
+ cache.__set__('file', file);
+ cache.init();
+ });
+
+ it('should get ok when not cached', function() {
+ cache.del(K);
+ assert.equal(cache.get(K), null);
+ assert.equal(cache.del(K), false);
});
- it('should ok when cached', function() {
- assert.equal(cache.set(k, v), true);
+ it('should get ok when cached', function() {
+ assert.equal(cache.set(K, V), true);
+ assert.deepEqual(cache.get(K), V);
+ assert.equal(cache.del(K), true);
+ });
+
+ it('should list ok when no cached', function() {
+ const items = cache.list();
+ assert.equal(items.length, 0);
+ });
- assert.deepEqual(cache.get(k), v);
- assert.equal(cache.del(k), true);
+ it('should list ok when cached', function() {
+ assert.equal(cache.set(K, V), true);
+ const items = cache.list();
+ assert.equal(items.length, 1);
+ assert.equal(items[0].name, K);
+ assert.equal(items[0].size, JSON.stringify(V).length);
});
});
diff --git a/test/test_chalk.js b/test/test_chalk.js
new file mode 100644
index 00000000..b0c17089
--- /dev/null
+++ b/test/test_chalk.js
@@ -0,0 +1,91 @@
+'use strict';
+const assert = require('chai').assert;
+const rewire = require('rewire');
+
+// refer to https://en.wikipedia.org/wiki/ANSI_escape_code
+describe('chalk', function() {
+ let chalk;
+
+ beforeEach(function() {
+ chalk = rewire('../lib/chalk');
+ chalk.enabled = true;
+ chalk.use256 = true;
+ chalk.use16m = false;
+ });
+
+ it('should ok w/ 256 colors', function() {
+ chalk.init();
+ chalk.setTheme('default');
+
+ assert.equal(chalk.black(' '), '\u001b[38;5;16m \u001b[39m');
+ assert.equal(chalk.red(' '), '\u001b[38;5;196m \u001b[39m');
+ assert.equal(chalk.green(' '), '\u001b[38;5;46m \u001b[39m');
+ assert.equal(chalk.yellow(' '), '\u001b[38;5;226m \u001b[39m');
+ assert.equal(chalk.blue(' '), '\u001b[38;5;21m \u001b[39m');
+ assert.equal(chalk.magenta(' '), '\u001b[38;5;201m \u001b[39m');
+ assert.equal(chalk.cyan(' '), '\u001b[38;5;51m \u001b[39m');
+ assert.equal(chalk.white(' '), '\u001b[38;5;231m \u001b[39m');
+
+ assert.equal(chalk.bold(' '), '\u001b[1m \u001b[22m');
+ assert.equal(chalk.dim(' '), '\u001b[2m \u001b[22m');
+ assert.equal(chalk.italic(' '), '\u001b[3m \u001b[23m');
+ assert.equal(chalk.inverse(' '), '\u001b[7m \u001b[27m');
+ assert.equal(chalk.strikethrough(' '), '\u001b[9m \u001b[29m');
+ assert.equal(chalk.underline(' '), '\u001b[4m \u001b[24m');
+ });
+
+ it('should ok w/ 8 colors', function() {
+ chalk.use256 = false;
+ chalk.init();
+ chalk.setTheme('default');
+
+ assert.equal(chalk.black(' '), '\u001b[30m \u001b[39m');
+ assert.equal(chalk.red(' '), '\u001b[91m \u001b[39m');
+ assert.equal(chalk.green(' '), '\u001b[92m \u001b[39m');
+ assert.equal(chalk.yellow(' '), '\u001b[93m \u001b[39m');
+ assert.equal(chalk.blue(' '), '\u001b[94m \u001b[39m');
+ assert.equal(chalk.magenta(' '), '\u001b[95m \u001b[39m');
+ assert.equal(chalk.cyan(' '), '\u001b[96m \u001b[39m');
+ assert.equal(chalk.white(' '), '\u001b[97m \u001b[39m');
+ });
+
+ it('should ok w/o colors', function() {
+ chalk.enabled = false;
+ chalk.init();
+ chalk.setTheme('default');
+
+ assert.equal(chalk.black(' '), ' ');
+ assert.equal(chalk.red(' '), ' ');
+ assert.equal(chalk.green(' '), ' ');
+ assert.equal(chalk.yellow(' '), ' ');
+ assert.equal(chalk.blue(' '), ' ');
+ assert.equal(chalk.magenta(' '), ' ');
+ assert.equal(chalk.cyan(' '), ' ');
+ assert.equal(chalk.white(' '), ' ');
+ });
+
+ it('should sprint w/ 256 colors ok', function() {
+ chalk.init();
+ chalk.setTheme('default');
+ assert.equal(chalk.sprint(' ', '#00ff00'), '\u001b[38;5;46m \u001b[39m');
+ });
+
+ it('should sprint w/ 8 colors ok', function() {
+ chalk.use256 = false;
+ chalk.init();
+ chalk.setTheme('default');
+ assert.equal(chalk.sprint(' ', '#00ff00'), '\u001b[92m \u001b[39m');
+ });
+
+ it('should set theme ok', function() {
+ chalk.init();
+ chalk.setTheme('dark');
+ assert.equal(chalk.sprint(' ', '#009900'), chalk.green(' '));
+ });
+
+ it('should set unknown theme ok', function() {
+ chalk.init();
+ chalk.setTheme('unknown');
+ assert.equal(chalk.sprint(' ', '#00ff00'), chalk.green(' '));
+ });
+});
diff --git a/test/test_config.js b/test/test_config.js
index 684ed29f..9ae828dd 100644
--- a/test/test_config.js
+++ b/test/test_config.js
@@ -1,37 +1,64 @@
-var assert = require('chai').assert;
-var rewire = require('rewire');
-var _ = require('underscore');
+'use strict';
+const assert = require('chai').assert;
+const rewire = require('rewire');
+const _ = require('underscore');
+
+const th = require('./helper');
describe('config', function() {
- it('should ok w/o local config', function() {
- var h = rewire('../lib/helper');
- h.getConfigFile = function() {
- return 'local-config-not-exist-at-all';
- };
+ let config;
+ const FILE = './tmp/config.json';
+
+ beforeEach(function() {
+ th.clean();
+
+ const file = rewire('../lib/file');
+ file.configFile = () => FILE;
+
+ config = rewire('../lib/config');
+ config.__set__('file', file);
+ });
- var config = rewire('../lib/config');
- config.__set__('h', h);
+ function createConfigFile(data) {
+ const fs = require('fs');
+ fs.writeFileSync(FILE, JSON.stringify(data));
+ }
+
+ it('should ok w/o local config', function() {
+ const DEFAULT_CONFIG = config.__get__('DEFAULT_CONFIG');
config.init();
- var expect = config.__get__('DEFAULT_CONFIG');
- var actual = _.extendOwn({}, config); // remove 'init' function
- assert.equal(_.isEqual(actual, expect), true);
+ let actual = config.getAll();
+ let expect = DEFAULT_CONFIG;
+ assert.deepEqual(actual, expect);
+
+ actual = config.getAll(true);
+ expect = _.omit(expect, 'sys');
+ assert.deepEqual(actual, expect);
});
it('should ok w/ local config', function() {
- var localConfig = {LANG: 'ruby', USE_COLOR: false, AUTO_LOGIN: false};
+ createConfigFile({
+ autologin: {enable: false},
+ code: {lang: 'ruby'},
+ color: {enable: false}
+ });
+ config.init();
- var h = rewire('../lib/helper');
- h.getFileData = function() {
- return JSON.stringify(localConfig);
- };
+ assert.equal(config.autologin.enable, false);
+ assert.equal(config.code.lang, 'ruby');
+ assert.equal(config.color.enable, false);
+ assert.equal(config.code.editor, 'vim');
+ });
- var config = rewire('../lib/config');
- config.__set__('h', h);
+ it('should remove legacy keys', function() {
+ createConfigFile({
+ USE_COLOR: true,
+ code: {lang: 'ruby'}
+ });
config.init();
- var expect = _.extendOwn(config.__get__('DEFAULT_CONFIG'), localConfig);
- var actual = _.extendOwn({}, config); // remove 'init' function
- assert.equal(_.isEqual(actual, expect), true);
+ assert.equal(config.USE_COLOR, undefined);
+ assert.equal(config.code.lang, 'ruby');
});
});
diff --git a/test/test_core.js b/test/test_core.js
index b0481f2d..0a436bb4 100644
--- a/test/test_core.js
+++ b/test/test_core.js
@@ -1,211 +1,366 @@
-var assert = require('chai').assert;
-var fs = require('fs');
-var rewire = require('rewire');
-
-var core = rewire('../lib/core');
-
-// mock depedencies
-var h = rewire('../lib/helper');
-var cache = rewire('../lib/cache');
-var client = rewire('../lib/leetcode_client');
+'use strict';
+const assert = require('chai').assert;
+const rewire = require('rewire');
describe('core', function() {
- var home = './tmp';
+ let core;
+ let next;
+
+ const PROBLEMS = [
+ {
+ category: 'algorithms',
+ id: 0,
+ fid: 0,
+ name: 'name0',
+ slug: 'slug0',
+ level: 'Hard',
+ locked: true,
+ starred: false,
+ state: 'ac',
+ tags: ['google', 'facebook']
+ },
+ {
+ category: 'algorithms',
+ companies: ['amazon', 'facebook'],
+ id: 1,
+ fid: 1,
+ name: 'name1',
+ slug: 'slug1',
+ level: 'Easy',
+ locked: false,
+ starred: true,
+ state: 'none'
+ }
+ ];
before(function() {
- if (!fs.existsSync(home)) fs.mkdirSync(home);
-
- h.getHomeDir = function() {
- return home;
- };
-
- cache.__set__('h', h);
- core.__set__('cache', cache);
- core.__set__('client', client);
+ const log = require('../lib/log');
+ log.init();
});
- describe('#user', function() {
- var USER = {name: 'test-user'};
-
- it('should login ok', function(done) {
- // before login
- cache.del('.user');
- assert.equal(core.getUser(), null);
- assert.equal(core.isLogin(), false);
-
- client.login = function(user, cb) {
- return cb(null, user);
- };
+ beforeEach(function() {
+ next = {};
+ next.getProblems = cb => cb(null, PROBLEMS);
+ next.getProblem = (p, cb) => cb(null, p);
- core.login(USER, function(e, user) {
- assert.equal(e, null);
- assert.deepEqual(USER, user);
-
- // after login
- assert.deepEqual(core.getUser(), user);
- assert.equal(core.isLogin(), true);
+ core = rewire('../lib/core');
+ core.setNext(next);
+ });
- done();
- });
+ describe('#filterProblems', function() {
+ it('should filter by query ok', function(done) {
+ const cases = [
+ ['', [0, 1]],
+ ['x', [0, 1]],
+ ['h', [0]],
+ ['H', [1]],
+ ['m', []],
+ ['M', [0, 1]],
+ ['l', [0]],
+ ['L', [1]],
+ ['s', [1]],
+ ['S', [0]],
+ ['d', [0]],
+ ['D', [1]],
+ ['eLsD', [1]],
+ ['Dh', []]
+ ];
+ let n = cases.length;
+
+ for (let x of cases) {
+ core.filterProblems({query: x[0]}, function(e, problems) {
+ assert.notExists(e);
+ assert.equal(problems.length, x[1].length);
+
+ for (let i = 0; i < problems.length; ++i)
+ assert.equal(problems[i], PROBLEMS[x[1][i]]);
+ if (--n === 0) done();
+ });
+ }
});
- it('should logout ok', function(done) {
- // before logout
- cache.set('.user', USER);
- assert.deepEqual(core.getUser(), USER);
- assert.equal(core.isLogin(), true);
-
- // after logout
- core.logout(USER);
- assert.equal(core.getUser(), null);
- assert.equal(core.isLogin(), false);
-
- done();
+ it('should filter by tag ok', function(done) {
+ const cases = [
+ [[], [0, 1]],
+ [['facebook'], [0, 1]],
+ [['google'], [0]],
+ [['amazon'], [1]],
+ [['apple'], []],
+ ];
+ let n = cases.length;
+
+ for (let x of cases) {
+ core.filterProblems({tag: x[0]}, function(e, problems) {
+ assert.notExists(e);
+ assert.equal(problems.length, x[1].length);
+
+ for (let i = 0; i < problems.length; ++i)
+ assert.equal(problems[i], PROBLEMS[x[1][i]]);
+ if (--n === 0) done();
+ });
+ }
});
- }); // #user
-
- describe('#problems', function() {
- var PROBLEMS = [
- {id: 0, name: 'name0', key: 'key0'},
- {id: 1, name: 'name1', key: 'key1'}
- ];
- var RESULTS = [
- {name: 'result0'},
- {name: 'result1'}
- ];
-
- it('should getProblems w/ cache ok', function(done) {
- cache.set('all', PROBLEMS);
-
- core.getProblems(function(e, problems) {
- assert.equal(e, null);
- assert.deepEqual(problems, PROBLEMS);
+ it('should fail if getProblems error', function(done) {
+ next.getProblems = cb => cb('getProblems error');
+ core.filterProblems({}, function(e) {
+ assert.equal(e, 'getProblems error');
done();
});
});
+ }); // #filterProblems
- it('should getProblems w/o cache ok', function(done) {
- cache.del('all');
-
- client.getProblems = function(cb) {
- return cb(null, PROBLEMS);
- };
-
- core.getProblems(function(e, problems) {
- assert.equal(e, null);
- assert.deepEqual(problems, PROBLEMS);
+ describe('#starProblem', function() {
+ it('should ok', function(done) {
+ next.starProblem = (p, starred, cb) => cb(null, starred);
+ assert.equal(PROBLEMS[0].starred, false);
+ core.starProblem(PROBLEMS[0], true, function(e, starred) {
+ assert.notExists(e);
+ assert.equal(starred, true);
done();
});
});
- it('should getProblem by id w/ cache ok', function(done) {
- cache.set('all', PROBLEMS);
- cache.set('key0', PROBLEMS[0]);
-
- core.getProblem(0, function(e, problem) {
- assert.equal(e, null);
- assert.deepEqual(problem, PROBLEMS[0]);
-
+ it('should ok if already starred', function(done) {
+ assert.equal(PROBLEMS[1].starred, true);
+ core.starProblem(PROBLEMS[1], true, function(e, starred) {
+ assert.notExists(e);
+ assert.equal(starred, true);
done();
});
});
- it('should getProblem by name w/ cache ok', function(done) {
- cache.set('all', PROBLEMS);
- cache.set('key0', PROBLEMS[0]);
-
- core.getProblem('name0', function(e, problem) {
- assert.equal(e, null);
- assert.deepEqual(problem, PROBLEMS[0]);
-
+ it('should ok if already unstarred', function(done) {
+ assert.equal(PROBLEMS[0].starred, false);
+ core.starProblem(PROBLEMS[0], false, function(e, starred) {
+ assert.notExists(e);
+ assert.equal(starred, false);
done();
});
});
+ }); // #starProblem
- it('should getProblem by key w/ cache ok', function(done) {
- cache.set('all', PROBLEMS);
- cache.set('key0', PROBLEMS[0]);
+ describe('#exportProblem', function() {
+ let file;
- core.getProblem('key0', function(e, problem) {
- assert.equal(e, null);
- assert.deepEqual(problem, PROBLEMS[0]);
+ beforeEach(function() {
+ file = rewire('../lib/file');
+ file.init();
+ core.__set__('file', file);
+ });
- done();
- });
+ it('should codeonly ok', function() {
+ file.isWindows = () => false;
+
+ const expected = [
+ '/**',
+ ' * Definition for singly-linked list.',
+ ' * struct ListNode {',
+ ' * int val;',
+ ' * ListNode *next;',
+ ' * ListNode(int x) : val(x), next(NULL) {}',
+ ' * };',
+ ' */',
+ 'class Solution {',
+ 'public:',
+ ' ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {',
+ ' ',
+ ' }',
+ '};',
+ ''
+ ].join('\n');
+
+ const problem = require('./mock/add-two-numbers.20161015.json');
+ const opts = {
+ lang: 'cpp',
+ code: problem.templates[0].defaultCode,
+ tpl: 'codeonly'
+ };
+ assert.equal(core.exportProblem(problem, opts), expected);
});
- it('should getProblem by id w/o cache ok', function(done) {
- cache.set('all', PROBLEMS);
- cache.del('key0');
+ it('should codeonly ok in windows', function() {
+ file.isWindows = () => true;
+
+ const expected = [
+ '/**',
+ ' * Definition for singly-linked list.',
+ ' * struct ListNode {',
+ ' * int val;',
+ ' * ListNode *next;',
+ ' * ListNode(int x) : val(x), next(NULL) {}',
+ ' * };',
+ ' */',
+ 'class Solution {',
+ 'public:',
+ ' ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {',
+ ' ',
+ ' }',
+ '};',
+ ''
+ ].join('\r\n');
+
+ const problem = require('./mock/add-two-numbers.20161015.json');
+ const opts = {
+ lang: 'cpp',
+ code: problem.templates[0].defaultCode,
+ tpl: 'codeonly'
+ };
+ assert.equal(core.exportProblem(problem, opts), expected);
+ });
- client.getProblem = function(problem, cb) {
- return cb(null, problem);
+ it('should detailed ok with cpp', function() {
+ file.isWindows = () => false;
+
+ const expected = [
+ '/*',
+ ' * @lc app=leetcode id=2 lang=cpp',
+ ' *',
+ ' * [2] Add Two Numbers',
+ ' *',
+ ' * https://leetcode.com/problems/add-two-numbers',
+ ' *',
+ ' * algorithms',
+ ' * Medium (25.37%)',
+ ' * Total Accepted: 195263',
+ ' * Total Submissions: 769711',
+ ' * Testcase Example: \'[2,4,3]\\n[5,6,4]\'',
+ ' *',
+ ' * You are given two linked lists representing two non-negative numbers. The',
+ ' * digits are stored in reverse order and each of their nodes contain a single',
+ ' * digit. Add the two numbers and return it as a linked list.',
+ ' * ',
+ ' * Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)',
+ ' * Output: 7 -> 0 -> 8',
+ ' */',
+ '/**',
+ ' * Definition for singly-linked list.',
+ ' * struct ListNode {',
+ ' * int val;',
+ ' * ListNode *next;',
+ ' * ListNode(int x) : val(x), next(NULL) {}',
+ ' * };',
+ ' */',
+ 'class Solution {',
+ 'public:',
+ ' ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {',
+ ' ',
+ ' }',
+ '};',
+ ''
+ ].join('\n');
+
+ const problem = require('./mock/add-two-numbers.20161015.json');
+ const opts = {
+ lang: 'cpp',
+ code: problem.templates[0].defaultCode,
+ tpl: 'detailed'
};
+ assert.equal(core.exportProblem(problem, opts), expected);
+ });
+
+ it('should detailed ok with ruby', function() {
+ file.isWindows = () => false;
+
+ const expected = [
+ '#',
+ '# @lc app=leetcode id=2 lang=ruby',
+ '#',
+ '# [2] Add Two Numbers',
+ '#',
+ '# https://leetcode.com/problems/add-two-numbers',
+ '#',
+ '# algorithms',
+ '# Medium (25.37%)',
+ '# Total Accepted: 195263',
+ '# Total Submissions: 769711',
+ '# Testcase Example: \'\'',
+ '#',
+ '# You are given two linked lists representing two non-negative numbers. The',
+ '# digits are stored in reverse order and each of their nodes contain a single',
+ '# digit. Add the two numbers and return it as a linked list.',
+ '# ',
+ '# Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)',
+ '# Output: 7 -> 0 -> 8',
+ '#',
+ '# Definition for singly-linked list.',
+ '# class ListNode',
+ '# attr_accessor :val, :next',
+ '# def initialize(val)',
+ '# @val = val',
+ '# @next = nil',
+ '# end',
+ '# end',
+ '',
+ '# @param {ListNode} l1',
+ '# @param {ListNode} l2',
+ '# @return {ListNode}',
+ 'def add_two_numbers(l1, l2)',
+ ' ',
+ 'end',
+ ''
+ ].join('\n');
+
+ const problem = require('./mock/add-two-numbers.20161015.json');
+ problem.testcase = null;
+ const opts = {
+ lang: 'ruby',
+ code: problem.templates[6].defaultCode,
+ tpl: 'detailed'
+ };
+ assert.equal(core.exportProblem(problem, opts), expected);
+ });
+ }); // #exportProblem
+ describe('#getProblem', function() {
+ it('should get by id ok', function(done) {
core.getProblem(0, function(e, problem) {
- assert.equal(e, null);
+ assert.notExists(e);
assert.deepEqual(problem, PROBLEMS[0]);
-
done();
});
});
- it('should getProblem error if not found', function(done) {
- cache.set('all', PROBLEMS);
+ it('should get by key ok', function(done) {
+ core.getProblem('slug0', function(e, problem) {
+ assert.notExists(e);
+ assert.deepEqual(problem, PROBLEMS[0]);
+ done();
+ });
+ });
+ it('should fail if not found', function(done) {
core.getProblem(3, function(e, problem) {
assert.equal(e, 'Problem not found!');
- assert.equal(problem, null);
-
done();
});
});
- it('should updateProblem ok', function(done) {
- cache.set('all', PROBLEMS);
- cache.del('key0');
-
- var kv = {name: 'name00', value: 'value0'};
- var ret = core.updateProblem(PROBLEMS[0], kv);
- assert.equal(ret, true);
+ it('should fail if client error', function(done) {
+ next.getProblem = (problem, cb) => cb('client getProblem error');
core.getProblem(0, function(e, problem) {
- assert.equal(e, null);
- assert.deepEqual(problem,
- {id: 0, name: 'name00', key: 'key0', value: 'value0'});
-
+ assert.equal(e, 'client getProblem error');
done();
});
});
- // dummy test
- it('should testProblem ok', function(done) {
- client.testProblem = function(problem, cb) {
- return cb(null, RESULTS);
- };
-
- core.testProblem(PROBLEMS[0], function(e, results) {
- assert.equal(e, null);
- assert.deepEqual(results, RESULTS);
-
+ it('should ok if problem is already there', function(done) {
+ core.getProblem(PROBLEMS[1], function(e, problem) {
+ assert.notExists(e);
+ assert.deepEqual(problem, PROBLEMS[1]);
done();
});
});
- // dummy test
- it('should submitProblem ok', function(done) {
- client.submitProblem = function(problem, cb) {
- return cb(null, RESULTS);
- };
-
- core.submitProblem(PROBLEMS[1], function(e, results) {
- assert.equal(e, null);
- assert.deepEqual(results, RESULTS);
+ it('should fail if getProblems error', function(done) {
+ next.getProblems = cb => cb('getProblems error');
+ core.getProblem(0, function(e, problem) {
+ assert.equal(e, 'getProblems error');
done();
});
});
- }); // #problems
+ }); // #getProblem
});
diff --git a/test/test_file.js b/test/test_file.js
new file mode 100644
index 00000000..d458e83f
--- /dev/null
+++ b/test/test_file.js
@@ -0,0 +1,163 @@
+'use strict';
+const fs = require('fs');
+const path = require('path');
+
+const assert = require('chai').assert;
+const rewire = require('rewire');
+
+const th = require('./helper');
+
+describe('file', function() {
+ let file;
+
+ beforeEach(function() {
+ file = rewire('../lib/file');
+ });
+
+ describe('#dirAndFiles', function() {
+ const HOME = path.join(__dirname, '..');
+
+ it('should ok on linux', function() {
+ if (file.isWindows()) this.skip();
+ process.env.HOME = '/home/skygragon';
+
+ assert.equal(file.userHomeDir(), '/home/skygragon');
+ assert.equal(file.homeDir(), '/home/skygragon/.lc');
+ assert.equal(file.cacheDir(), '/home/skygragon/.lc/leetcode/cache');
+ assert.equal(file.cacheFile('xxx'), '/home/skygragon/.lc/leetcode/cache/xxx.json');
+ assert.equal(file.configFile(), '/home/skygragon/.lc/config.json');
+ assert.equal(file.name('/home/skygragon/.lc/leetcode/cache/xxx.json'), 'xxx');
+ });
+
+ it('should ok on windows', function() {
+ if (!file.isWindows()) this.skip();
+ process.env.HOME = '';
+ process.env.USERPROFILE = 'C:\\Users\\skygragon';
+ assert.equal(file.userHomeDir(), 'C:\\Users\\skygragon');
+ assert.equal(file.homeDir(), 'C:\\Users\\skygragon\\.lc');
+ assert.equal(file.cacheDir(), 'C:\\Users\\skygragon\\.lc\\leetcode\\cache');
+ assert.equal(file.cacheFile('xxx'), 'C:\\Users\\skygragon\\.lc\\leetcode\\cache\\xxx.json');
+ assert.equal(file.configFile(), 'C:\\Users\\skygragon\\.lc\\config.json');
+ assert.equal(file.name('C:\\Users\\skygragon\\.lc\\leetcode\\cache\\xxx.json'), 'xxx');
+ });
+
+ it('should codeDir ok', function() {
+ assert.equal(file.codeDir(), HOME);
+ assert.equal(file.codeDir('.'), HOME);
+ assert.equal(file.codeDir('icons'), path.join(HOME, 'icons'));
+ assert.equal(file.codeDir('lib/plugins'), path.join(HOME, 'lib', 'plugins'));
+ });
+
+ it('should listCodeDir ok', function() {
+ const files = file.listCodeDir('lib/plugins');
+ assert.equal(files.length, 3);
+ assert.equal(files[0].name, 'cache');
+ assert.equal(files[1].name, 'leetcode');
+ assert.equal(files[2].name, 'retry');
+ });
+
+ it('should pluginFile ok', function() {
+ const expect = path.join(HOME, 'lib/plugins/cache.js');
+ assert.equal(file.pluginFile('cache.js'), expect);
+ assert.equal(file.pluginFile('./cache.js'), expect);
+ assert.equal(file.pluginFile('https://github.com/skygragon/cache.js'), expect);
+ });
+
+ it('should data ok with missing file', function() {
+ assert.equal(file.data('non-exist'), null);
+ });
+ }); // #dirAndFiles
+
+ describe('#meta', function() {
+ it('should meta ok within file content', function() {
+ file.data = x => [
+ '/ *',
+ ' * @lc app=leetcode id=123 lang=javascript',
+ ' * /'
+ ].join('\n');
+ const meta = file.meta('dummy');
+ assert.equal(meta.app, 'leetcode')
+ assert.equal(meta.id, '123');
+ assert.equal(meta.lang, 'javascript');
+ });
+
+ it('should meta ok with white space', function() {
+ file.data = x => [
+ '/ *',
+ ' * @lc app=leetcode id=123\t \t lang=javascript\r',
+ ' * /'
+ ].join('\n');
+ const meta = file.meta('dummy');
+ assert.equal(meta.app, 'leetcode')
+ assert.equal(meta.id, '123');
+ assert.equal(meta.lang, 'javascript');
+ });
+
+ it('should meta ok within file name', function() {
+ file.data = x => [
+ '/ *',
+ ' * no meta app=leetcode id=123 lang=javascript',
+ ' * /'
+ ].join('\n');
+ const meta = file.meta('321.dummy.py');
+ assert(!meta.app)
+ assert.equal(meta.id, '321');
+ assert.equal(meta.lang, 'python');
+ });
+
+ it('should meta ok within deprecated file name', function() {
+ file.data = x => [
+ '/ *',
+ ' * no meta app=leetcode id=123 lang=javascript',
+ ' * /'
+ ].join('\n');
+
+ var meta = file.meta('111.dummy.py3');
+ assert(!meta.app)
+ assert.equal(meta.id, '111');
+ assert.equal(meta.lang, 'python3');
+
+ meta = file.meta('222.dummy.python3.py');
+ assert(!meta.app)
+ assert.equal(meta.id, '222');
+ assert.equal(meta.lang, 'python3');
+ });
+
+ it('should fmt ok', function() {
+ file.init();
+ const data = file.fmt('${id}', {id: 123});
+ assert.equal(data, '123');
+ });
+ }); // #meta
+
+ describe('#genneral', function() {
+ beforeEach(function() {
+ th.clean();
+ });
+ afterEach(function() {
+ th.clean();
+ });
+
+ it('should mkdir ok', function() {
+ const dir = th.DIR + 'dir';
+ assert.equal(fs.existsSync(dir), false);
+ file.mkdir(dir);
+ assert.equal(fs.existsSync(dir), true);
+ file.mkdir(dir);
+ assert.equal(fs.existsSync(dir), true);
+ });
+
+ it('should mv ok', function() {
+ const SRC = th.Dir + 'src';
+ const DST = th.DIR + 'dst';
+ assert.equal(fs.existsSync(SRC), false);
+ assert.equal(fs.existsSync(DST), false);
+ file.mkdir(SRC);
+ assert.equal(fs.existsSync(SRC), true);
+ assert.equal(fs.existsSync(DST), false);
+ file.mv(SRC, DST);
+ assert.equal(fs.existsSync(SRC), false);
+ assert.equal(fs.existsSync(DST), true);
+ });
+ }); // #general
+});
diff --git a/test/test_helper.js b/test/test_helper.js
index 59c02e68..143bda9e 100644
--- a/test/test_helper.js
+++ b/test/test_helper.js
@@ -1,9 +1,21 @@
-var assert = require('chai').assert;
-var chalk = require('chalk');
+'use strict';
+const assert = require('chai').assert;
+const rewire = require('rewire');
+const _ = require('underscore');
-var h = require('../lib/helper');
+const chalk = require('../lib/chalk');
describe('helper', function() {
+ let h;
+
+ before(function() {
+ chalk.init();
+ });
+
+ beforeEach(function() {
+ h = rewire('../lib/helper');
+ });
+
describe('#prettyState', function() {
it('should ok w/ color', function() {
chalk.enabled = true;
@@ -44,6 +56,43 @@ describe('helper', function() {
});
}); // #prettyText
+ describe('#prettyLevel', function() {
+ it('should ok w/ color', function() {
+ chalk.enabled = true;
+
+ assert.equal(h.prettyLevel('Easy'), chalk.green('Easy'));
+ assert.equal(h.prettyLevel('Medium'), chalk.yellow('Medium'));
+ assert.equal(h.prettyLevel('Hard'), chalk.red('Hard'));
+ assert.equal(h.prettyLevel('easy '), chalk.green('easy '));
+ assert.equal(h.prettyLevel('medium'), chalk.yellow('medium'));
+ assert.equal(h.prettyLevel('hard '), chalk.red('hard '));
+ assert.equal(h.prettyLevel('unknown'), 'unknown');
+ });
+ }); // #prettyLevel
+
+ describe('#prettySize', function() {
+ it('should ok', function() {
+ assert.equal(h.prettySize(0), '0.00B');
+ assert.equal(h.prettySize(512), '512.00B');
+ assert.equal(h.prettySize(1024), '1.00K');
+ assert.equal(h.prettySize(1024 * 1024), '1.00M');
+ assert.equal(h.prettySize(1024 * 1024 * 1024), '1.00G');
+ });
+ }); // #prettySize
+
+ describe('#prettyTime', function() {
+ it('should ok', function() {
+ assert.equal(h.prettyTime(30), '30 seconds');
+ assert.equal(h.prettyTime(60), '1 minutes');
+ assert.equal(h.prettyTime(2400), '40 minutes');
+ assert.equal(h.prettyTime(3600), '1 hours');
+ assert.equal(h.prettyTime(7200), '2 hours');
+ assert.equal(h.prettyTime(86400), '1 days');
+ assert.equal(h.prettyTime(86400 * 3), '3 days');
+ assert.equal(h.prettyTime(86400 * 7), '1 weeks');
+ });
+ }); // #prettyTime
+
describe('#levelToName', function() {
it('should ok', function() {
assert.equal(h.levelToName(0), ' ');
@@ -71,58 +120,149 @@ describe('helper', function() {
describe('#langToExt', function() {
it('should ok', function() {
+ assert.equal(h.langToExt('bash'), '.sh');
assert.equal(h.langToExt('c'), '.c');
assert.equal(h.langToExt('cpp'), '.cpp');
assert.equal(h.langToExt('csharp'), '.cs');
assert.equal(h.langToExt('golang'), '.go');
assert.equal(h.langToExt('java'), '.java');
assert.equal(h.langToExt('javascript'), '.js');
+ assert.equal(h.langToExt('mysql'), '.sql');
+ assert.equal(h.langToExt('php'), '.php');
assert.equal(h.langToExt('python'), '.py');
+ assert.equal(h.langToExt('python3'), '.py');
assert.equal(h.langToExt('ruby'), '.rb');
+ assert.equal(h.langToExt('rust'), '.rs');
+ assert.equal(h.langToExt('scala'), '.scala');
assert.equal(h.langToExt('swift'), '.swift');
- assert.equal(h.langToExt('rust'), '.raw');
});
}); // #langToExt
describe('#extToLang', function() {
it('should ok', function() {
+ assert.equal(h.extToLang('/usr/bin/file.sh'), 'bash');
assert.equal(h.extToLang('/home/skygragon/file.c'), 'c');
assert.equal(h.extToLang('/var/log/file.cpp'), 'cpp');
assert.equal(h.extToLang('./file.cs'), 'csharp');
assert.equal(h.extToLang('../file.go'), 'golang');
assert.equal(h.extToLang('file.java'), 'java');
assert.equal(h.extToLang('c:/file.js'), 'javascript');
+ assert.equal(h.extToLang('~/leetcode/../file.sql'), 'mysql');
+ assert.equal(h.extToLang('~/leetcode/hello.php'), 'php');
assert.equal(h.extToLang('c:/Users/skygragon/file.py'), 'python');
assert.equal(h.extToLang('~/file.rb'), 'ruby');
+ assert.equal(h.extToLang('~/leetcode/file.rs'), 'rust');
+ assert.equal(h.extToLang('/tmp/file.scala'), 'scala');
assert.equal(h.extToLang('~/leetcode/file.swift'), 'swift');
assert.equal(h.extToLang('/home/skygragon/file.dat'), 'unknown');
});
}); // #extToLang
- describe('#dirAndFiles', function() {
+ describe('#langToCommentStyle', function() {
it('should ok', function() {
- process.env.HOME = '/home/skygragon';
+ const C_STYLE = {start: '/*', line: ' *', end: ' */'};
+ const RUBY_STYLE = {start: '#', line: '#', end: '#'};
+ const SQL_STYLE = {start: '--', line: '--', end: '--'};
- assert.equal(h.getHomeDir(), '/home/skygragon');
- assert.equal(h.getCacheDir(), '/home/skygragon/.lc/');
- assert.equal(h.getCacheFile('xxx'), '/home/skygragon/.lc/xxx.json');
- assert.equal(h.getConfigFile(), '/home/skygragon/.lcconfig');
- assert.equal(h.getFilename('/home/skygragon/.lc/xxx.json'), 'xxx');
+ assert.deepEqual(h.langToCommentStyle('bash'), RUBY_STYLE);
+ assert.deepEqual(h.langToCommentStyle('c'), C_STYLE);
+ assert.deepEqual(h.langToCommentStyle('cpp'), C_STYLE);
+ assert.deepEqual(h.langToCommentStyle('csharp'), C_STYLE);
+ assert.deepEqual(h.langToCommentStyle('golang'), C_STYLE);
+ assert.deepEqual(h.langToCommentStyle('java'), C_STYLE);
+ assert.deepEqual(h.langToCommentStyle('javascript'), C_STYLE);
+ assert.deepEqual(h.langToCommentStyle('mysql'), SQL_STYLE);
+ assert.deepEqual(h.langToCommentStyle('php'), C_STYLE);
+ assert.deepEqual(h.langToCommentStyle('python'), RUBY_STYLE);
+ assert.deepEqual(h.langToCommentStyle('python3'), RUBY_STYLE);
+ assert.deepEqual(h.langToCommentStyle('ruby'), RUBY_STYLE);
+ assert.deepEqual(h.langToCommentStyle('rust'), C_STYLE);
+ assert.deepEqual(h.langToCommentStyle('scala'), C_STYLE);
+ assert.deepEqual(h.langToCommentStyle('swift'), C_STYLE);
});
- }); // #dirAndFiles
+ }); // #langToCommentStyle
describe('#getSetCookieValue', function() {
it('should ok', function() {
- var resp = {
+ const resp = {
headers: {'set-cookie': [
'key1=value1; path=/; Httponly',
'key2=value2; path=/; Httponly']
}
};
+ const respNoSetCookie = {
+ headers: {}
+ };
assert.equal(h.getSetCookieValue(resp, 'key1'), 'value1');
assert.equal(h.getSetCookieValue(resp, 'key2'), 'value2');
assert.equal(h.getSetCookieValue(resp, 'key3'), null);
+ assert.equal(h.getSetCookieValue(respNoSetCookie, 'key1'), null);
});
}); // #getSetCookieValue
+
+ describe('#printSafeHTTP', function() {
+ it('should hide sensitive info', function() {
+ const raw = [
+ "Cookie: 'xxxxxx'",
+ "'X-CSRFToken': 'yyyyyy'",
+ "'set-cookie': ['zzzzzz']"
+ ].join('\r\n');
+
+ const hide = [
+ 'Cookie: ',
+ "'X-CSRFToken': ",
+ "'set-cookie': "
+ ].join('\r\n');
+
+ assert.equal(h.printSafeHTTP(raw), hide);
+ });
+ }); // #printSafeHTTP
+
+ describe('#readStdin', function() {
+ function hijackStdin(data) {
+ const stream = require('stream');
+ const rs = new stream.Readable();
+ rs.push(data);
+ rs.push(null);
+
+ Object.defineProperty(process, 'stdin', {value: rs});
+ }
+
+ it('should ok', function(done) {
+ hijackStdin('[1,2]\n3');
+
+ h.readStdin(function(e, data) {
+ assert.equal(data, '[1,2]\n3');
+ done();
+ });
+ });
+
+ it('should ok w/ empty input', function(done) {
+ hijackStdin('');
+
+ h.readStdin(function(e, data) {
+ assert.equal(data, '');
+ done();
+ });
+ });
+ }); // #readStdin
+
+ describe('#badge', function() {
+ it('should ok', function() {
+ chalk.enabled = true;
+ assert.equal(h.badge('x'), chalk.white.bgBlue(' x '));
+ assert.equal(h.badge('x', 'green'), chalk.black.bgGreen(' x '));
+ });
+
+ it('should ok with random', function() {
+ const badges = _.values(h.__get__('COLORS'))
+ .map(function(x) {
+ return chalk[x.fg][x.bg](' random ');
+ });
+
+ const i = badges.indexOf(h.badge('random', 'random'));
+ assert.equal(i >= 0, true);
+ });
+ }); // #badge
});
diff --git a/test/test_icon.js b/test/test_icon.js
new file mode 100644
index 00000000..5da832ab
--- /dev/null
+++ b/test/test_icon.js
@@ -0,0 +1,55 @@
+'use strict';
+const assert = require('chai').assert;
+const rewire = require('rewire');
+
+describe('icon', function() {
+ let icon;
+ let file;
+
+ beforeEach(function() {
+ file = rewire('../lib/file');
+ file.listCodeDir = function() {
+ return [
+ {name: 'mac', data: {yes: 'yes', no: 'no', lock: 'lock', like: 'like', unlike: 'unlike'}},
+ {name: 'win7', data: {yes: 'YES', no: 'NO', lock: 'LOCK', like: 'LIKE', unlike: 'UNLIKE'}}
+ ];
+ };
+
+ icon = rewire('../lib/icon');
+ icon.__set__('file', file);
+ icon.init();
+ });
+
+ describe('#setTheme', function() {
+ it('should ok with known theme', function() {
+ icon.setTheme('mac');
+ assert.equal(icon.yes, 'yes');
+ assert.equal(icon.no, 'no');
+ assert.equal(icon.lock, 'lock');
+ assert.equal(icon.like, 'like');
+ assert.equal(icon.unlike, 'unlike');
+ });
+
+ it('should ok with unknown theme on linux', function() {
+ file.isWindows = () => false;
+
+ icon.setTheme('non-exist');
+ assert.equal(icon.yes, '✔');
+ assert.equal(icon.no, '✘');
+ assert.equal(icon.lock, '🔒');
+ assert.equal(icon.like, '★');
+ assert.equal(icon.unlike, '☆');
+ });
+
+ it('should ok with unknown theme on windows', function() {
+ file.isWindows = () => true;
+
+ icon.setTheme('non-exist');
+ assert.equal(icon.yes, 'YES');
+ assert.equal(icon.no, 'NO');
+ assert.equal(icon.lock, 'LOCK');
+ assert.equal(icon.like, 'LIKE');
+ assert.equal(icon.unlike, 'UNLIKE');
+ });
+ }); // #setTheme
+});
diff --git a/test/test_leetcode_client.js b/test/test_leetcode_client.js
deleted file mode 100644
index ac293e88..00000000
--- a/test/test_leetcode_client.js
+++ /dev/null
@@ -1,220 +0,0 @@
-var assert = require('chai').assert;
-var nock = require('nock');
-
-var client = require('../lib/leetcode_client');
-var config = require('../lib/config');
-
-describe('leetcode_client', function() {
- before(function() {
- config.init();
- });
-
- describe('#getProblems', function() {
- it('should ok', function(done) {
- nock(config.URL_PROBLEMS)
- .get('/')
- .replyWithFile(200, './test/mock/problems.json.20160911');
-
- client.getProblems(function(e, problems) {
- assert.equal(e, null);
- assert.equal(problems.length, 377);
-
- done();
- });
- });
- }); // #getProblems
-
- describe('#getProblem', function() {
- it('should ok', function(done) {
- var problem = {
- id: 389,
- name: 'Find the Difference',
- key: 'find-the-difference',
- link: 'https://leetcode.com/problems/find-the-difference',
- locked: false
- };
-
- nock('https://leetcode.com')
- .get('/problems/find-the-difference')
- .replyWithFile(200, './test/mock/find-the-difference.html.20160911');
-
- client.getProblem(problem, function(e, problem) {
- assert.equal(e, null);
- assert.equal(problem.totalAC, 15674);
- assert.equal(problem.totalSubmit, 32141);
- assert.equal(problem.desc,
- [
- '',
- 'Given two strings s and t which consist of only lowercase letters.',
- '',
- 'String t is generated by random shuffling string s and then add one more letter at a random position.',
- '',
- 'Find the letter that was added in t.',
- '',
- 'Example:',
- '',
- 'Input:',
- 's = "abcd"',
- 't = "abcde"',
- '',
- 'Output:',
- 'e',
- '',
- 'Explanation:',
- "'e' is the letter that was added.",
- ''
- ].join('\r\n'));
-
- assert.equal(problem.templates.length, 7);
-
- assert.equal(problem.templates[0].value, 'cpp');
- assert.equal(problem.templates[0].text, 'C++');
- assert.equal(problem.templates[0].defaultCode,
- [
- 'class Solution {',
- 'public:',
- ' char findTheDifference(string s, string t) {',
- ' ',
- ' }',
- '};'
- ].join('\r\n'));
-
- assert.equal(problem.templates[1].value, 'java');
- assert.equal(problem.templates[1].text, 'Java');
- assert.equal(problem.templates[1].defaultCode,
- [
- 'public class Solution {',
- ' public char findTheDifference(String s, String t) {',
- ' ',
- ' }',
- '}'
- ].join('\r\n'));
-
- assert.equal(problem.templates[2].value, 'python');
- assert.equal(problem.templates[2].text, 'Python');
- assert.equal(problem.templates[2].defaultCode,
- [
- 'class Solution(object):',
- ' def findTheDifference(self, s, t):',
- ' """',
- ' :type s: str',
- ' :type t: str',
- ' :rtype: str',
- ' """'
- ].join('\r\n'));
-
- assert.equal(problem.templates[3].value, 'c');
- assert.equal(problem.templates[3].text, 'C');
- assert.equal(problem.templates[3].defaultCode,
- [
- 'char findTheDifference(char* s, char* t) {',
- ' ',
- '}'
- ].join('\r\n'));
-
- assert.equal(problem.templates[4].value, 'csharp');
- assert.equal(problem.templates[4].text, 'C#');
- assert.equal(problem.templates[4].defaultCode,
- [
- 'public class Solution {',
- ' public char FindTheDifference(string s, string t) {',
- ' ',
- ' }',
- '}'
- ].join('\r\n'));
-
- assert.equal(problem.templates[5].value, 'javascript');
- assert.equal(problem.templates[5].text, 'JavaScript');
- assert.equal(problem.templates[5].defaultCode,
- [
- '/**',
- ' * @param {string} s',
- ' * @param {string} t',
- ' * @return {character}',
- ' */',
- 'var findTheDifference = function(s, t) {',
- ' ',
- '};'
- ].join('\r\n'));
-
- assert.equal(problem.templates[6].value, 'ruby');
- assert.equal(problem.templates[6].text, 'Ruby');
- assert.equal(problem.templates[6].defaultCode,
- [
- '# @param {String} s',
- '# @param {String} t',
- '# @return {Character}',
- 'def find_the_difference(s, t)',
- ' ',
- 'end'
- ].join('\r\n'));
-
- done();
- });
- });
- }); // #getProblem
-
- describe('#testProblem', function() {
- it('should ok', function(done) {
- var problem = {
- id: 389,
- name: 'Find the Difference',
- key: 'find-the-difference',
- link: 'https://leetcode.com/problems/find-the-difference',
- locked: false,
- file: '/dev/null'
- };
-
- nock('https://leetcode.com')
- .post('/problems/find-the-difference/interpret_solution/')
- .reply(200, '{"interpret_expected_id": "id1", "interpret_id": "id2"}');
-
- nock('https://leetcode.com')
- .get('/submissions/detail/id1/check/')
- .reply(200, '{"state": "SUCCESS"}');
-
- nock('https://leetcode.com')
- .get('/submissions/detail/id2/check/')
- .reply(200, '{"state": "SUCCESS"}');
-
- client.testProblem(problem, function(e, results) {
- assert.equal(e, null);
- assert.deepEqual(results,
- [
- {name: 'Your', state: 'SUCCESS'},
- {name: 'Expected', state: 'SUCCESS'}
- ]);
-
- done();
- });
- });
- }); // #testProblem
-
- describe('#submitProblem', function() {
- it('should ok', function(done) {
- var problem = {
- id: 389,
- name: 'Find the Difference',
- key: 'find-the-difference',
- link: 'https://leetcode.com/problems/find-the-difference',
- locked: false,
- file: '/dev/null'
- };
-
- nock('https://leetcode.com')
- .post('/problems/find-the-difference/submit/')
- .reply(200, '{"submission_id": "id1"}');
-
- nock('https://leetcode.com')
- .get('/submissions/detail/id1/check/')
- .reply(200, '{"state": "SUCCESS"}');
-
- client.submitProblem(problem, function(e, results) {
- assert.equal(e, null);
- assert.deepEqual(results, [{name: 'Your', state: 'SUCCESS'}]);
-
- done();
- });
- });
- }); // #submitProblem
-});
diff --git a/test/test_log.js b/test/test_log.js
new file mode 100644
index 00000000..92e5ef4b
--- /dev/null
+++ b/test/test_log.js
@@ -0,0 +1,109 @@
+'use strict';
+const assert = require('chai').assert;
+const rewire = require('rewire');
+
+const chalk = require('../lib/chalk');
+
+describe('log', function() {
+ let log;
+ let savedOutput;
+ let expected;
+
+ before(function() {
+ chalk.init();
+ });
+
+ beforeEach(function() {
+ log = rewire('../lib/log');
+ savedOutput = log.output;
+ log.output = x => expected = x;
+
+ log.init();
+ expected = '';
+ });
+
+ afterEach(function() {
+ log.output = savedOutput;
+ });
+
+ describe('#setLevel', function() {
+ it('should ok with known level', function() {
+ log.setLevel('TRACE');
+ assert.deepEqual(log.level, log.levels.get('TRACE'));
+ log.setLevel('DEBUG');
+ assert.deepEqual(log.level, log.levels.get('DEBUG'));
+ log.setLevel('INFO');
+ assert.deepEqual(log.level, log.levels.get('INFO'));
+ log.setLevel('WARN');
+ assert.deepEqual(log.level, log.levels.get('WARN'));
+ log.setLevel('ERROR');
+ assert.deepEqual(log.level, log.levels.get('ERROR'));
+ });
+
+ it('should ok with unknown level', function() {
+ log.setLevel('');
+ assert.deepEqual(log.level, log.levels.get('INFO'));
+ });
+ }); // #setLevel
+
+ describe('#isEnabled', function() {
+ it('should ok', function() {
+ log.setLevel('DEBUG');
+ assert.equal(log.isEnabled('TRACE'), false);
+ assert.equal(log.isEnabled('DEBUG'), true);
+ assert.equal(log.isEnabled('INFO'), true);
+ assert.equal(log.isEnabled('WARN'), true);
+ assert.equal(log.isEnabled('ERROR'), true);
+ });
+ }); // #isEnabled
+
+ describe('#levels', function() {
+ it('should ok with log.trace', function() {
+ log.trace('some error');
+ assert.equal(expected, '');
+
+ log.setLevel('TRACE');
+ log.trace('some error');
+ assert.equal(expected, chalk.gray('[TRACE] some error'));
+ });
+
+ it('should ok with log.debug', function() {
+ log.debug('some error');
+ assert.equal(expected, '');
+
+ log.setLevel('DEBUG');
+ log.debug('some error');
+ assert.equal(expected, chalk.gray('[DEBUG] some error'));
+ });
+
+ it('should ok with log.info', function() {
+ log.info('some error');
+ assert.equal(expected, 'some error');
+ });
+
+ it('should ok with log.warn', function() {
+ log.warn('some error');
+ assert.equal(expected, chalk.yellow('[WARN] some error'));
+ });
+
+ it('should ok with log.error', function() {
+ log.error('some error');
+ assert.equal(expected, chalk.red('[ERROR] some error'));
+ });
+
+ it('should ok with log.fail', function() {
+ log.fail({msg: 'some error', statusCode: 500});
+ assert.equal(expected, chalk.red('[ERROR] some error [code=500]'));
+
+ log.fail('some error');
+ assert.equal(expected, chalk.red('[ERROR] some error'));
+ });
+ }); // #levels
+
+ describe('#printf', function() {
+ it('should ok', function() {
+ log.printf('%s and %s and %%', 'string', 100);
+ assert.equal(expected, 'string and 100 and %');
+ });
+ }); // #printf
+});
diff --git a/test/test_plugin.js b/test/test_plugin.js
new file mode 100644
index 00000000..aa3a40be
--- /dev/null
+++ b/test/test_plugin.js
@@ -0,0 +1,223 @@
+'use strict';
+const fs = require('fs');
+const path = require('path');
+
+const assert = require('chai').assert;
+const rewire = require('rewire');
+
+const chalk = require('../lib/chalk');
+const config = require('../lib/config');
+const log = require('../lib/log');
+const th = require('./helper');
+
+const Plugin = rewire('../lib/plugin');
+
+describe('plugin', function() {
+ let file;
+ let cache;
+
+ const NOOP = () => {};
+
+ before(function() {
+ log.init();
+ chalk.init();
+ config.init();
+
+ file = rewire('../lib/file');
+ cache = rewire('../lib/cache');
+ Plugin.__set__('file', file);
+ Plugin.__set__('cache', cache);
+ });
+
+ beforeEach(function() {
+ th.clean();
+ cache.get = NOOP;
+ });
+
+ describe('#Plugin.init', function() {
+ const p1 = new Plugin(0, 'leetcode', '2.0');
+ const p2 = new Plugin(1, 'cache', '1.0');
+ const p3 = new Plugin(2, 'retry', '3.0');
+ const p4 = new Plugin(3, 'core', '4.0');
+
+ before(function() {
+ p1.init = p2.init = p3.init = p4.init = NOOP;
+ file.listCodeDir = function() {
+ return [
+ {name: 'cache', data: p2, file: 'cache.js'},
+ {name: 'leetcode', data: p1, file: 'leetcode.js'},
+ {name: 'retry', data: p3, file: 'retry.js'},
+ {name: 'bad', data: null}
+ ];
+ };
+ });
+
+ it('should init ok', function() {
+ cache.get = () => {
+ return {cache: true, leetcode: false, retry: true};
+ };
+ assert.deepEqual(Plugin.plugins, []);
+
+ const res = Plugin.init(p4);
+ assert.equal(res, true);
+ assert.deepEqual(Plugin.plugins.length, 3);
+
+ const names = Plugin.plugins.map(p => p.name);
+ assert.deepEqual(names, ['retry', 'cache', 'leetcode']);
+
+ assert.equal(p4.next, p3);
+ assert.equal(p3.next, p2);
+ assert.equal(p2.next, null);
+ assert.equal(p1.next, null);
+ });
+
+ it('should find missing ok', function() {
+ cache.get = () => {
+ return {company: true, leetcode: false, solution: true};
+ };
+
+ const res = Plugin.init(p4);
+ assert.equal(res, false);
+ assert.deepEqual(Plugin.plugins.length, 5);
+
+ const names = Plugin.plugins.map(p => p.name);
+ assert.deepEqual(names, ['retry', 'cache', 'leetcode', 'company', 'solution']);
+
+ assert.equal(p4.next, p3);
+ assert.equal(p3.next, p2);
+ assert.equal(p2.next, null);
+ assert.equal(p1.next, null);
+ });
+ }); // #Plugin.init
+
+ describe('#install', function() {
+ let expected;
+
+ before(function() {
+ Plugin.__set__('cp', {
+ exec: function(cmd, opts, cb) {
+ expected = cmd;
+ return cb();
+ }
+ });
+ });
+
+ it('should install no deps ok', function(done) {
+ expected = '';
+ const p = new Plugin(100, 'test', '2017.12.26', 'desc', []);
+ p.install(function() {
+ assert.equal(expected, '');
+ done();
+ });
+ });
+
+ it('should install deps ok', function(done) {
+ const deps = ['a', 'b:linux', 'b:darwin', 'b:win32', 'c:bad', 'd'];
+ const p = new Plugin(100, 'test', '2017.12.26', 'desc', deps);
+ p.install(function() {
+ assert.equal(expected, 'npm install --save a b d');
+ done();
+ });
+ });
+ }); // #install
+
+ describe('#Plugin.copy', function() {
+ const SRC = path.resolve(th.DIR, 'copy.src.js');
+ const DST = path.resolve(th.DIR, 'copy.test.js');
+
+ before(function() {
+ file.pluginFile = () => DST;
+ });
+
+ it('should copy from http error', function(done) {
+ Plugin.copy('non-exists', function(e, fullpath) {
+ assert.equal(e, 'HTTP Error: 404');
+ assert.equal(fs.existsSync(DST), false);
+ done();
+ });
+ }).timeout(5000);
+
+ it('should copy from local ok', function(done) {
+ const data = [
+ 'module.exports = {',
+ ' x: 123,',
+ ' install: function(cb) { cb(); }',
+ '};'
+ ];
+ fs.writeFileSync(SRC, data.join('\n'));
+
+ Plugin.copy(SRC, function(e, fullpath) {
+ assert.notExists(e);
+ assert.equal(fullpath, DST);
+ assert.equal(fs.existsSync(DST), true);
+ done();
+ });
+ });
+ }); // #Plugin.copy
+
+ describe('#Plugin.installMissings', function() {
+ const PLUGINS = [
+ new Plugin(0, '0', 'missing'),
+ new Plugin(1, '1', '2018.01.01'),
+ new Plugin(2, '2', 'missing'),
+ ];
+ let expected;
+
+ beforeEach(function() {
+ expected = [];
+ file.pluginFile = x => th.DIR + x;
+ Plugin.install = (name, cb) => {
+ expected.push(name);
+ return cb(null, PLUGINS[+name]);
+ };
+ });
+
+ it('should ok', function(done) {
+ Plugin.plugins = PLUGINS;
+ Plugin.installMissings(function(e) {
+ assert.notExists(e);
+ assert.deepEqual(expected, ['0', '2']);
+ done();
+ });
+ });
+ }); // #Plugin.installMissings
+
+ describe('#delete', function() {
+ it('should ok', function() {
+ file.pluginFile = x => th.DIR + x;
+
+ const p = new Plugin(0, '0', '2018.01.01');
+ p.file = '0.js';
+ fs.writeFileSync('./tmp/0.js', '');
+
+ assert.equal(p.deleted, false);
+ assert.deepEqual(fs.readdirSync(th.DIR), ['0.js']);
+ p.delete();
+ assert.equal(p.deleted, true);
+ assert.deepEqual(fs.readdirSync(th.DIR), []);
+ p.delete();
+ assert.equal(p.deleted, true);
+ assert.deepEqual(fs.readdirSync(th.DIR), []);
+ });
+ }); // #delete
+
+ describe('#save', function() {
+ it('should ok', function() {
+ let data = {};
+ cache.get = () => data;
+ cache.set = (k, x) => data = x;
+
+ const p = new Plugin(0, '0', '2018.01.01');
+ p.save();
+ assert.deepEqual(data, {'0': true});
+
+ p.enabled = false;
+ p.save();
+ assert.deepEqual(data, {'0': false});
+
+ p.deleted = true;
+ p.save();
+ assert.deepEqual(data, {});
+ });
+ }); // #save
+});
diff --git a/test/test_queue.js b/test/test_queue.js
new file mode 100644
index 00000000..9f87d25d
--- /dev/null
+++ b/test/test_queue.js
@@ -0,0 +1,58 @@
+'use strict';
+const assert = require('chai').assert;
+const rewire = require('rewire');
+
+
+
+describe('queue', function() {
+ let Queue;
+
+ beforeEach(function() {
+ Queue = rewire('../lib/queue');
+ });
+
+ it('should ok', function(done) {
+ function doTask(x, q, cb) {
+ ++q.ctx.n;
+ q.ctx.sum += x;
+ return cb();
+ }
+
+ const ctx = {n: 0, sum: 0};
+ const q = new Queue([], ctx, doTask);
+
+ q.addTask(1);
+ q.addTask(2);
+ q.addTasks([3, 4, 5]);
+
+ q.run(5, function(e, ctx) {
+ assert.notExists(e);
+ assert.equal(ctx.n, 5);
+ assert.equal(ctx.sum, 15);
+ done();
+ });
+ });
+
+ it('should ok in sequence', function(done) {
+ const config = {network: {}};
+ Queue.__set__('config', config);
+
+ function doTask(x, q, cb) {
+ if (!q.ctx.list) q.ctx.list = [];
+ q.ctx.list.push(x);
+ return cb();
+ }
+
+ const q = new Queue(null, null, doTask);
+ q.addTask(1);
+ q.addTasks([2, 3]);
+ q.addTasks([4]);
+ q.addTask(5);
+
+ q.run(null, function(e, ctx) {
+ assert.notExists(e);
+ assert.deepEqual(ctx.list, [1, 2, 3, 4, 5]);
+ done();
+ });
+ });
+});
diff --git a/test/test_session.js b/test/test_session.js
new file mode 100644
index 00000000..0638db2d
--- /dev/null
+++ b/test/test_session.js
@@ -0,0 +1,52 @@
+'use strict';
+const assert = require('chai').assert;
+const rewire = require('rewire');
+
+describe('session', function() {
+ let session;
+ let stats;
+ let now;
+
+ beforeEach(function() {
+ stats = null;
+ const cache = {
+ get: (k) => stats,
+ set: (k, v) => stats = v
+ };
+ const moment = () => {
+ return {format: () => now}
+ };
+
+ session = rewire('../lib/session');
+ session.__set__('cache', cache);
+ session.__set__('moment', moment);
+ });
+
+ describe('#updateStat', function() {
+ it('should update number ok', function() {
+ now = '2017.12.13';
+ session.updateStat('ac', 10);
+ assert.deepEqual(stats, {'2017.12.13': {ac: 10}});
+
+ session.updateStat('ac', 20);
+ assert.deepEqual(stats, {'2017.12.13': {ac: 30}});
+
+ now = '2017.12.14';
+ session.updateStat('ac', 40);
+ assert.deepEqual(stats, {
+ '2017.12.13': {ac: 30},
+ '2017.12.14': {ac: 40}
+ });
+ });
+
+ it('should update set ok', function() {
+ now = '2017.12.13';
+ session.updateStat('ac.set', 101);
+ assert.deepEqual(stats, {'2017.12.13': {'ac.set': [101]}});
+ session.updateStat('ac.set', 100);
+ assert.deepEqual(stats, {'2017.12.13': {'ac.set': [101, 100]}});
+ session.updateStat('ac.set', 101);
+ assert.deepEqual(stats, {'2017.12.13': {'ac.set': [101, 100]}});
+ });
+ }); // #updateStat
+});
diff --git a/test/test_sprintf.js b/test/test_sprintf.js
new file mode 100644
index 00000000..aed7cbc3
--- /dev/null
+++ b/test/test_sprintf.js
@@ -0,0 +1,33 @@
+'use strict';
+const assert = require('chai').assert;
+const rewire = require('rewire');
+
+const sprintf = require('../lib/sprintf');
+
+describe('sprintf', function() {
+ it('should ok', function() {
+ assert.equal(sprintf('%%'), '%');
+ assert.equal(sprintf('%s', 123), '123');
+ assert.equal(sprintf('%6s', 123), ' 123');
+ assert.equal(sprintf('%06s', 123), '000123');
+ assert.equal(sprintf('%-6s', 123), '123 ');
+ assert.equal(sprintf('%=6s', 123), ' 123 ');
+
+ assert.equal(sprintf('%4s,%=4s,%-4s', 123, 'xy', 3.1), ' 123, xy ,3.1 ');
+ });
+
+ it('should non-ascii ok', function() {
+ assert.equal(sprintf('%4s', '中'), ' 中');
+ assert.equal(sprintf('%-4s', '中'), '中 ');
+ assert.equal(sprintf('%=4s', '中'), ' 中 ');
+
+ assert.equal(sprintf('%=14s', '12你好34世界'), ' 12你好34世界 ');
+ });
+
+ it('should color ok', function() {
+ const chalk = rewire('../lib/chalk');
+ chalk.init();
+
+ assert.equal(sprintf('%=3s', chalk.red('X')), ' ' + chalk.red('X') + ' ');
+ });
+});