Add Biweekly 39 / weekly 215 solutions

This commit is contained in:
YDZ
2020-11-15 22:39:49 +08:00
parent 7d7007c6e3
commit 91e1a92cdd
8 changed files with 434 additions and 0 deletions

View File

@ -0,0 +1,56 @@
package leetcode
func decrypt(code []int, k int) []int {
if k == 0 {
for i := 0; i < len(code); i++ {
code[i] = 0
}
return code
}
count, sum, res := k, 0, make([]int, len(code))
if k > 0 {
for i := 0; i < len(code); i++ {
for j := i + 1; j < len(code); j++ {
if count == 0 {
break
}
sum += code[j]
count--
}
if count > 0 {
for j := 0; j < len(code); j++ {
if count == 0 {
break
}
sum += code[j]
count--
}
}
res[i] = sum
sum, count = 0, k
}
}
if k < 0 {
for i := 0; i < len(code); i++ {
for j := i - 1; j >= 0; j-- {
if count == 0 {
break
}
sum += code[j]
count++
}
if count < 0 {
for j := len(code) - 1; j >= 0; j-- {
if count == 0 {
break
}
sum += code[j]
count++
}
}
res[i] = sum
sum, count = 0, k
}
}
return res
}

View File

@ -0,0 +1,53 @@
package leetcode
import (
"fmt"
"testing"
)
type question1652 struct {
para1652
ans1652
}
// para 是参数
// one 代表第一个参数
type para1652 struct {
code []int
k int
}
// ans 是答案
// one 代表第一个答案
type ans1652 struct {
one []int
}
func Test_Problem1652(t *testing.T) {
qs := []question1652{
{
para1652{[]int{5, 7, 1, 4}, 3},
ans1652{[]int{12, 10, 16, 13}},
},
{
para1652{[]int{1, 2, 3, 4}, 0},
ans1652{[]int{0, 0, 0, 0}},
},
{
para1652{[]int{2, 4, 9, 3}, -2},
ans1652{[]int{12, 5, 6, 13}},
},
}
fmt.Printf("------------------------Leetcode Problem 1652------------------------\n")
for _, q := range qs {
_, p := q.ans1652, q.para1652
fmt.Printf("【input】:%v 【output】:%v \n", p, decrypt(p.code, p.k))
}
fmt.Printf("\n\n\n")
}

View File

@ -0,0 +1,49 @@
package leetcode
func minimumDeletions(s string) int {
ai, bi, sum, temp, array := 0, 0, 0, 0, []int{}
for ai = 0; ai < len(s); ai++ {
if s[ai] == 'a' {
break
}
}
if ai != 0 && ai != len(s) {
sum += ai
}
for bi = ai; bi < len(s); bi++ {
if s[bi] == 'b' {
break
}
}
if s[bi-1] == 'a' {
ai = bi - 1
}
if s[bi-1] == 'b' && bi != len(s) {
ai = bi + 1
}
for j := bi; j < len(s); j++ {
if s[j] == 'b' {
temp++
}
if s[j] == 'a' && temp != 0 {
array = append(array, temp)
temp = 0
}
}
if len(array) == 0 {
return sum
}
dp := make([]int, len(array))
dp[0] = min(array[0], len(array))
for i := 1; i < len(array); i++ {
dp[i] = min(dp[i-1]+array[i], dp[i-1]+len(array)-(i+1)+1)
}
return sum + dp[len(array)-1]
}
func min(a int, b int) int {
if a > b {
return b
}
return a
}

View File

@ -0,0 +1,57 @@
package leetcode
import (
"fmt"
"testing"
)
type question1649 struct {
para1649
ans1649
}
// para 是参数
// one 代表第一个参数
type para1649 struct {
s string
}
// ans 是答案
// one 代表第一个答案
type ans1649 struct {
one int
}
func Test_Problem1649(t *testing.T) {
qs := []question1649{
// {
// para1649{"aababbab"},
// ans1649{2},
// },
// {
// para1649{"bbaaaaabb"},
// ans1649{2},
// },
{
para1649{"b"},
ans1649{0},
},
{
para1649{"ababaaaabbbbbaaababbbbbbaaabbaababbabbbbaabbbbaabbabbabaabbbababaa"},
ans1649{25},
},
}
fmt.Printf("------------------------Leetcode Problem 1649------------------------\n")
for _, q := range qs {
_, p := q.ans1649, q.para1649
fmt.Printf("【input】:%v 【output】:%v \n", p, minimumDeletions(p.s))
}
fmt.Printf("\n\n\n")
}

View File

@ -0,0 +1,42 @@
package leetcode
import (
"fmt"
)
type OrderedStream struct {
ptr int
stream []string
}
func Constructor(n int) OrderedStream {
ptr, stream := 1, make([]string, n+1)
return OrderedStream{ptr: ptr, stream: stream}
}
func (this *OrderedStream) Insert(id int, value string) []string {
this.stream[id] = value
res := []string{}
fmt.Printf("%v %v %v\n", this.ptr, id, value)
if this.ptr == id || this.stream[this.ptr] != "" {
res = append(res, this.stream[this.ptr])
for i := id + 1; i < len(this.stream); i++ {
if this.stream[i] != "" {
res = append(res, this.stream[i])
} else {
this.ptr = i
return res
}
}
}
if len(res) > 0 {
return res
}
return []string{}
}
/**
* Your OrderedStream object will be instantiated and called as such:
* obj := Constructor(n);
* param_1 := obj.Insert(id,value);
*/

View File

@ -0,0 +1,21 @@
package leetcode
import (
"fmt"
"testing"
)
func Test_Problem707(t *testing.T) {
obj := Constructor(5)
fmt.Printf("obj = %v\n", obj)
param1 := obj.Insert(3, "ccccc")
fmt.Printf("param_1 = %v obj = %v\n", param1, obj)
param1 = obj.Insert(1, "aaaaa")
fmt.Printf("param_1 = %v obj = %v\n", param1, obj)
param1 = obj.Insert(2, "bbbbb")
fmt.Printf("param_1 = %v obj = %v\n", param1, obj)
param1 = obj.Insert(5, "eeeee")
fmt.Printf("param_1 = %v obj = %v\n", param1, obj)
param1 = obj.Insert(4, "ddddd")
fmt.Printf("param_1 = %v obj = %v\n", param1, obj)
}

View File

@ -0,0 +1,88 @@
package leetcode
import (
"sort"
)
func closeStrings(word1 string, word2 string) bool {
if len(word1) != len(word2) {
return false
}
freqWord1, freq1, freqList1, freqWord2, freq2, freqList2, flag := map[byte]int{}, []int{}, map[int][]byte{}, map[byte]int{}, []int{}, map[int][]byte{}, false
for i := 0; i < len(word1); i++ {
freqWord1[word1[i]]++
}
for i := 0; i < len(word2); i++ {
freqWord2[word2[i]]++
}
freqTemp1 := map[int]int{}
for k, v := range freqWord1 {
freqTemp1[v]++
if list, ok := freqList1[v]; ok {
list = append(list, k)
freqList1[v] = list
} else {
list := []byte{}
list = append(list, k)
freqList1[v] = list
}
}
for _, v := range freqTemp1 {
freq1 = append(freq1, v)
}
freqTemp2 := map[int]int{}
for k, v := range freqWord2 {
freqTemp2[v]++
if list, ok := freqList2[v]; ok {
list = append(list, k)
freqList2[v] = list
} else {
list := []byte{}
list = append(list, k)
freqList2[v] = list
}
}
for _, v := range freqTemp2 {
freq2 = append(freq2, v)
}
if len(freq1) != len(freq2) {
return false
}
sort.Ints(freq1)
sort.Ints(freq2)
for i := 0; i < len(freq1); i++ {
if freq1[i] != freq2[i] {
flag = true
break
}
}
if flag == true {
return false
}
flag = false
// 频次相同,再判断字母交换是否合法存在
for k, v := range freqWord1 {
if list, ok := freqList2[v]; ok {
for i := 0; i < len(list); i++ {
if list[i] != k && list[i] != '0' {
// 交换的字母不存在
if _, ok := freqWord1[list[i]]; !ok {
flag = true
break
} else {
// 交换的字母存在,重置这一位,代表这一个字母被交换了,下次不用它
list[i] = '0'
}
}
}
} else {
// 出现频次个数相同,但是频次不同
flag = true
break
}
}
if flag == true {
return false
}
return true
}

View File

@ -0,0 +1,68 @@
package leetcode
import (
"fmt"
"testing"
)
type question1649 struct {
para1649
ans1649
}
// para 是参数
// one 代表第一个参数
type para1649 struct {
word1 string
word2 string
}
// ans 是答案
// one 代表第一个答案
type ans1649 struct {
one bool
}
func Test_Problem1649(t *testing.T) {
qs := []question1649{
{
para1649{"abc", "bca"},
ans1649{true},
},
{
para1649{"a", "aa"},
ans1649{false},
},
{
para1649{"cabbba", "abbccc"},
ans1649{true},
},
{
para1649{"cabbba", "aabbss"},
ans1649{false},
},
{
para1649{"uau", "ssx"},
ans1649{false},
},
{
para1649{"uuukuuuukkuusuususuuuukuskuusuuusuusuuuuuuk", "kssskkskkskssskksskskksssssksskksskskksksuu"},
ans1649{false},
},
}
fmt.Printf("------------------------Leetcode Problem 1649------------------------\n")
for _, q := range qs {
_, p := q.ans1649, q.para1649
fmt.Printf("【input】:%v 【output】:%v \n", p, closeStrings(p.word1, p.word2))
}
fmt.Printf("\n\n\n")
}