Compare commits
No commits in common. "7bdd2b5d0197cad209f4f9aa5c0fb2f4d3dacca6" and "0f5f9e331ca8c04358d4156da99933e856dab38e" have entirely different histories.
7bdd2b5d01
...
0f5f9e331c
11 changed files with 8 additions and 4129 deletions
5
Makefile
5
Makefile
|
|
@ -1,7 +1,4 @@
|
||||||
lint:
|
lint:
|
||||||
golangci-lint run ./...
|
golangci-lint run ./...
|
||||||
|
|
||||||
problemset:
|
.PHONY: lint
|
||||||
bash ./query-problem-set.sh > problemset.jsonl
|
|
||||||
|
|
||||||
.PHONY: lint problemset
|
|
||||||
|
|
|
||||||
23
create.sh
23
create.sh
|
|
@ -1,30 +1,21 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
id=$1
|
num=$1
|
||||||
|
|
||||||
echo "$id" | grep -q "^[1-9][0-9]\{,4\}$" || {
|
echo "$num" | grep -q "^[1-9][0-9]\{,4\}$" || {
|
||||||
echo "Err: no valid problem ID provided." >&2
|
echo "Err: no valid number given" >&2
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
parent=$((id / 100))
|
parent=$((num / 100))
|
||||||
pdir="solutions/${parent}/q${id}"
|
pdir="solutions/${parent}/q${num}"
|
||||||
|
|
||||||
sol_file="${pdir}/solution.go"
|
sol_file="${pdir}/solution.go"
|
||||||
|
|
||||||
if [ -f "$sol_file" ]; then
|
if [ -f "$sol_file" ]; then
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
title_slug=$(jq -r "select(.id == $id) | .titleSlug" ./problemset.jsonl)
|
echo "Creating template for question No. $num" >&2
|
||||||
[ -n "$title_slug" ] || {
|
|
||||||
echo "Err: problem $id not found in the problem set." >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
echo -e "Creating template for problem \033[32m${id}: $title_slug\033[0m" >&2
|
|
||||||
mkdir -pv "$pdir"
|
mkdir -pv "$pdir"
|
||||||
echo "// Package q$id implements solution for https://leetcode.com/problems/$title_slug/" > "$sol_file"
|
echo "package q$num" > "$sol_file"
|
||||||
echo "package q$id" >> "$sol_file"
|
|
||||||
|
|
||||||
echo "Created $sol_file"
|
echo "Created $sol_file"
|
||||||
|
|
|
||||||
3851
problemset.jsonl
3851
problemset.jsonl
File diff suppressed because it is too large
Load diff
|
|
@ -1,37 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
query() {
|
|
||||||
page=$1
|
|
||||||
offset=$((page * 100))
|
|
||||||
|
|
||||||
# shellcheck disable=SC2016
|
|
||||||
curl -sSLf 'https://leetcode.com/graphql/' \
|
|
||||||
--compressed \
|
|
||||||
-H 'content-type: application/json' \
|
|
||||||
--data-raw '{
|
|
||||||
"query": "\n query problemsetQuestionListV2($filters: QuestionFilterInput, $limit: Int, $searchKeyword: String, $skip: Int, $sortBy: QuestionSortByInput, $categorySlug: String) {\n problemsetQuestionListV2(\n filters: $filters\n limit: $limit\n searchKeyword: $searchKeyword\n skip: $skip\n sortBy: $sortBy\n categorySlug: $categorySlug\n ) {\n questions {\n id\n titleSlug\n title\n translatedTitle\n questionFrontendId\n paidOnly\n difficulty\n topicTags {\n name\n slug\n nameTranslated\n }\n status\n isInMyFavorites\n frequency\n acRate\n contestPoint\n }\n totalLength\n finishedLength\n hasMore\n }\n}\n ",
|
|
||||||
"variables": {
|
|
||||||
"skip": '"$offset"',
|
|
||||||
"limit": 100,
|
|
||||||
"categorySlug": "all-code-essentials",
|
|
||||||
"filters": {"filterCombineType":"ALL","statusFilter":{"questionStatuses":[],"operator":"IS"},"difficultyFilter":{"difficulties":[],"operator":"IS"},"languageFilter":{"languageSlugs":[],"operator":"IS"},"topicFilter":{"topicSlugs":[],"operator":"IS"},"acceptanceFilter":{},"frequencyFilter":{},"frontendIdFilter":{},"lastSubmittedFilter":{},"publishedFilter":{},"companyFilter":{"companySlugs":[],"operator":"IS"},"positionFilter":{"positionSlugs":[],"operator":"IS"},"positionLevelFilter":{"positionLevelSlugs":[],"operator":"IS"},"contestPointFilter":{"contestPoints":[],"operator":"IS"},"premiumFilter":{"premiumStatus":[],"operator":"IS"}},
|
|
||||||
"searchKeyword": "",
|
|
||||||
"sortBy": {"sortField":"CUSTOM","sortOrder":"ASCENDING"},
|
|
||||||
"filtersV2": {"filterCombineType":"ALL","statusFilter":{"questionStatuses":[],"operator":"IS"},"difficultyFilter":{"difficulties":[],"operator":"IS"},"languageFilter":{"languageSlugs":[],"operator":"IS"},"topicFilter":{"topicSlugs":[],"operator":"IS"},"acceptanceFilter":{},"frequencyFilter":{},"frontendIdFilter":{},"lastSubmittedFilter":{},"publishedFilter":{},"companyFilter":{"companySlugs":[],"operator":"IS"},"positionFilter":{"positionSlugs":[],"operator":"IS"},"positionLevelFilter":{"positionLevelSlugs":[],"operator":"IS"},"contestPointFilter":{"contestPoints":[],"operator":"IS"},"premiumFilter":{"premiumStatus":[],"operator":"IS"}}
|
|
||||||
},
|
|
||||||
"operationName": "problemsetQuestionListV2"
|
|
||||||
}' | jq -c '.data.problemsetQuestionListV2.questions[] | { id, title, titleSlug, difficulty, paidOnly, tags: [ .topicTags[] | .slug ] }'
|
|
||||||
}
|
|
||||||
|
|
||||||
page=0
|
|
||||||
while true; do
|
|
||||||
echo -ne " Querying page $((page + 1)) ...\r" >&2
|
|
||||||
content=$(query $page)
|
|
||||||
lines=$(echo "$content" | wc -l)
|
|
||||||
echo "$content"
|
|
||||||
|
|
||||||
[ "$lines" -lt 100 ] && break
|
|
||||||
page=$((page + 1))
|
|
||||||
done | jq -s -c 'sort_by(.id) | .[]'
|
|
||||||
echo >&2
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
package q1022
|
|
||||||
|
|
||||||
type TreeNode struct {
|
|
||||||
Val int
|
|
||||||
Left *TreeNode
|
|
||||||
Right *TreeNode
|
|
||||||
}
|
|
||||||
|
|
||||||
func sum(node *TreeNode, prefix int, ret *int) {
|
|
||||||
if node == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
num := prefix<<1 + node.Val
|
|
||||||
|
|
||||||
if node.Left == nil && node.Right == nil {
|
|
||||||
*ret += num
|
|
||||||
} else {
|
|
||||||
sum(node.Left, num, ret)
|
|
||||||
sum(node.Right, num, ret)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func sumRootToLeaf(root *TreeNode) int {
|
|
||||||
ret := 0
|
|
||||||
sum(root, 0, &ret)
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = sumRootToLeaf
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
||||||
package q1356
|
|
||||||
|
|
||||||
import "slices"
|
|
||||||
|
|
||||||
func count1s(n int) int {
|
|
||||||
c := 0
|
|
||||||
for n > 0 {
|
|
||||||
c++
|
|
||||||
n = n & (n - 1)
|
|
||||||
}
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func sortByBits(arr []int) []int {
|
|
||||||
for i := range arr {
|
|
||||||
arr[i] += count1s(arr[i]) << 16
|
|
||||||
}
|
|
||||||
slices.Sort(arr)
|
|
||||||
|
|
||||||
for i := range arr {
|
|
||||||
arr[i] &= 1<<16 - 1
|
|
||||||
}
|
|
||||||
return arr
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = sortByBits
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
package q1404
|
|
||||||
|
|
||||||
func numSteps(s string) int {
|
|
||||||
steps := 0
|
|
||||||
carry := false
|
|
||||||
for i := len(s) - 1; i > 0; i-- {
|
|
||||||
switch {
|
|
||||||
case !carry && s[i] == '0':
|
|
||||||
steps++
|
|
||||||
case !carry && s[i] == '1':
|
|
||||||
steps += 2
|
|
||||||
carry = true
|
|
||||||
case carry && s[i] == '0':
|
|
||||||
steps += 2
|
|
||||||
default:
|
|
||||||
steps++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if carry {
|
|
||||||
steps++
|
|
||||||
}
|
|
||||||
return steps
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = numSteps
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
package q693
|
|
||||||
|
|
||||||
func hasAlternatingBits(n int) bool {
|
|
||||||
last := -1
|
|
||||||
for n > 0 {
|
|
||||||
if last == n%2 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
last = n % 2
|
|
||||||
n >>= 1
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = hasAlternatingBits
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
package q696
|
|
||||||
|
|
||||||
func countBinarySubstrings(s string) int {
|
|
||||||
cnt := 0
|
|
||||||
last := byte('0')
|
|
||||||
lastLen, curLen := 0, 0
|
|
||||||
for i := range len(s) {
|
|
||||||
if s[i] != last {
|
|
||||||
last, lastLen = s[i], curLen
|
|
||||||
curLen = 0
|
|
||||||
}
|
|
||||||
curLen++
|
|
||||||
if curLen <= lastLen {
|
|
||||||
cnt++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cnt
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = countBinarySubstrings
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
package q761
|
|
||||||
|
|
||||||
func toNumber(arrs ...[]byte) int {
|
|
||||||
r := 0
|
|
||||||
for i := range arrs {
|
|
||||||
for _, num := range arrs[i] {
|
|
||||||
r = r<<1 + int(num)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
func fromNumber(arr []byte, num int) {
|
|
||||||
for i := len(arr) - 1; i >= 0; i-- {
|
|
||||||
arr[i] = byte(num % 2)
|
|
||||||
num >>= 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func move(arr []byte) int {
|
|
||||||
specials := [][2]int{}
|
|
||||||
specialsMap := make(map[int][]int, len(arr)+1)
|
|
||||||
val := toNumber(arr)
|
|
||||||
|
|
||||||
for i := range len(arr) - 1 {
|
|
||||||
if arr[i] == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
bal := 1
|
|
||||||
for j := i + 1; j < len(arr); j++ {
|
|
||||||
switch arr[j] {
|
|
||||||
case 0:
|
|
||||||
bal--
|
|
||||||
case 1:
|
|
||||||
bal++
|
|
||||||
}
|
|
||||||
|
|
||||||
if bal < 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if bal == 0 {
|
|
||||||
specials = append(specials, [2]int{i, j})
|
|
||||||
specialsMap[i] = append(specialsMap[i], j)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := range specials {
|
|
||||||
l1, r1 := specials[i][0], specials[i][1]
|
|
||||||
l2 := r1 + 1
|
|
||||||
for _, r2 := range specialsMap[l2] {
|
|
||||||
swapped := toNumber(arr[:l1], arr[l2:r2+1], arr[l1:l2], arr[r2+1:])
|
|
||||||
if swapped > val {
|
|
||||||
val = swapped
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return val
|
|
||||||
}
|
|
||||||
|
|
||||||
func makeLargestSpecial(s string) string {
|
|
||||||
arr := []byte(s)
|
|
||||||
for i := range arr {
|
|
||||||
arr[i] -= '0'
|
|
||||||
}
|
|
||||||
|
|
||||||
val := toNumber(arr)
|
|
||||||
for {
|
|
||||||
newVal := move(arr)
|
|
||||||
if newVal > val {
|
|
||||||
val = newVal
|
|
||||||
fromNumber(arr, newVal)
|
|
||||||
} else {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := range arr {
|
|
||||||
arr[i] += '0'
|
|
||||||
}
|
|
||||||
return string(arr)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = makeLargestSpecial
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
package q918
|
|
||||||
|
|
||||||
func maxSubarraySumCircular(nums []int) int {
|
|
||||||
maxSum, minSum, maxPfx, minPfx := nums[0], nums[0], 0, 0
|
|
||||||
|
|
||||||
sum := 0
|
|
||||||
for _, num := range nums {
|
|
||||||
sum += num
|
|
||||||
maxSum = max(maxSum, sum-minPfx)
|
|
||||||
minSum = min(minSum, sum-maxPfx)
|
|
||||||
|
|
||||||
maxPfx = max(maxPfx, sum)
|
|
||||||
minPfx = min(minPfx, sum)
|
|
||||||
}
|
|
||||||
|
|
||||||
if sum == minSum {
|
|
||||||
return maxSum
|
|
||||||
}
|
|
||||||
return max(maxSum, sum-minSum)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = maxSubarraySumCircular
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue