diff --git a/solutions/10/q1022/solution.go b/solutions/10/q1022/solution.go new file mode 100644 index 0000000..ee96d2e --- /dev/null +++ b/solutions/10/q1022/solution.go @@ -0,0 +1,29 @@ +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 diff --git a/solutions/13/q1356/solution.go b/solutions/13/q1356/solution.go new file mode 100644 index 0000000..4c341b8 --- /dev/null +++ b/solutions/13/q1356/solution.go @@ -0,0 +1,26 @@ +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 diff --git a/solutions/14/q1404/solution.go b/solutions/14/q1404/solution.go new file mode 100644 index 0000000..41e097c --- /dev/null +++ b/solutions/14/q1404/solution.go @@ -0,0 +1,25 @@ +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 diff --git a/solutions/6/q693/solution.go b/solutions/6/q693/solution.go new file mode 100644 index 0000000..e9fca63 --- /dev/null +++ b/solutions/6/q693/solution.go @@ -0,0 +1,15 @@ +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 diff --git a/solutions/6/q696/solution.go b/solutions/6/q696/solution.go new file mode 100644 index 0000000..dd93f49 --- /dev/null +++ b/solutions/6/q696/solution.go @@ -0,0 +1,20 @@ +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 diff --git a/solutions/7/q761/solution.go b/solutions/7/q761/solution.go new file mode 100644 index 0000000..13d574e --- /dev/null +++ b/solutions/7/q761/solution.go @@ -0,0 +1,84 @@ +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 diff --git a/solutions/9/q918/solution.go b/solutions/9/q918/solution.go new file mode 100644 index 0000000..0c41ff0 --- /dev/null +++ b/solutions/9/q918/solution.go @@ -0,0 +1,22 @@ +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