【TalkGo算法之美】第 1 次在线比赛

报名参加


本次比赛代码都不是最佳解法,请勿模仿。

第一题

简单题 ,wa了两次。。:hot_pepper::chicken:

func maximumTime(time string) string {
	var ans = strings.Builder{}
	for i := 0; i < len(time); i++ {
		if time[i]=='?'{
			switch i {
			case 0:
				if time[1]!='?' && time[1] >'3'{
					ans.WriteByte('1')
				}else {
					ans.WriteByte('2')
				}
				
			case 1:
				if ans.String()[0]<'2'{
					ans.WriteByte('9')
				}else {
					ans.WriteByte('3')
				}

			case 3:
				ans.WriteByte('5')
			case 4:
				ans.WriteByte('9')
			}
		}else {
			ans.WriteByte(time[i])
		}
	}
	return ans.String()
}

第二题

‘a~'z’都模拟一遍 ,就这题。。wa了三次,太:hot_pepper::chicken:了。

func min(a, b int) int {
	if a<b{
		return a
	}
	return b
}
func minCharacters(a string, b string) int {
	ab,bb := make([]int, 26),make([]int, 26)
	for i := 0; i < len(a); i++ {
	    ab[a[i]-'a']++
	}
	for i := 0; i < len(b); i++ {
		bb[b[i]-'a']++
	}
	ans := min(operator(ab,bb), operator(bb,ab))
	max:=0
	for i := 0; i < 26; i++ {
		ab[i]+=bb[i]
	}
	for i := 0; i < 26; i++ {
		if max < ab[i]{
			max = ab[i]
		}
	}
    // fmt.Println(max)
	return min(ans, len(a)+len(b)-max)
}

func operator(a, b []int) int {
	ans :=math.MaxInt32
	for i := 1; i < 26; i++ {
		temp :=0
		for j := 0; j < i; j++ {
			temp +=a[j]
		}
		for j := i; j < 26; j++ {
			temp +=b[j]
		}
		if temp < ans{
			ans = temp
		}
	}
	return ans
}

第三题

类似前缀和的思想求出矩阵前缀异或,再排序取第k个(这边可以用快排的partition优化复杂度,比赛就没想那么多了)

func kthLargestValue(matrix [][]int, k int) int {
	var xor = make([][]int, len(matrix))
	for i := 0; i < len(matrix); i++ {
		xor[i] = make([]int, len(matrix[0]))
	}
	temp := 0
	for i := 0; i < len(matrix[0]); i++ {
		temp ^= matrix[0][i]
		xor[0][i] = temp
	}
	for i := 1; i < len(matrix); i++ {
		for j := 0; j < len(matrix[0]); j++ {
			if j==0 {
				xor[i][0]=xor[i-1][0]^matrix[i][0]
			}else {
				xor[i][j] = xor[i-1][j]^xor[i][j-1]^xor[i-1][j-1]^matrix[i][j]
			}
		}
	}
	var ans = make([]int, len(matrix)*len(matrix[0]))
	index :=0
	for i := 0; i < len(xor); i++ {
		for j := 0; j < len(xor[i]); j++ {
			ans[index] = xor[i][j]
         index++

		}
	}
	sort.Ints(ans)
	return ans[len(ans)-k]
}

第四题

脑筋急转弯,观察得知(比较难解释,就类似1+2+3。。。+n,不够的话再把最右边看成墙壁,再计算需要补多少个底座)

func minimumBoxes(n int) int {
	i := 1
	total := 1
	for total+(i+1)*(i+2)/2 < n {
		i++
		total += (i + 1) * (i) / 2
	}
	n = n-total
   
	temp :=int(math.Sqrt(float64(n*2)))
	if temp*(temp+1)/2 >= n{
		return (i+1)*i/2+temp 
	}else {
		return (i+1)*i/2+temp+1
	}
}

最后排名:

2 个赞