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

第一题: 替换隐藏数字得到的最晚时间

 func maximumTime(time string) string {
	arr := strings.Split(time, ":")
	hour := []byte(arr[0])
	minite := []byte(arr[1])

	if hour[0] == '?' {
		if hour[1] == '?' || hour[1] - '0' < 4 {
			hour[0] = '2'
		}else {
			hour[0] = '1'
		}
	}

	if hour[1] == '?' {
		switch hour[0] {
		case '0','1':
			hour[1] = '9'
		case '2':
			hour[1] = '3'
		default:
		}
	}
	if minite[0] == '?' {
		minite[0] = '5'
	}
	if minite[1] == '?' {
		minite[1] = '9'
	}

	return string(hour) + ":" + string(minite)
}

第二题: 满足三条件之一需改变的最少字符数

/*
满足条件一的方案:a中的所有字符都小于b中的所有字符-》a中的所有字符小于b中最小的字符
这时可以枚举最小字符a~z, 假设如果最小字符是d, 那么最小的操作数应该为: b中小于字符d的字符数 + a中大于等于字符d的字符数
*/

func LessThanMinCharacters(a string, b string) int {
	aCharNums := [26]int{}
	bCharNums := [26]int{}

	for _, ch := range a {
		aCharNums[ch - 'a']++
	}
	for _, ch := range b {
		bCharNums[ch - 'a']++
	}
	min := math.MaxInt32

	for i := 0; i < 26; i++ {
		tmpt := 0
		if i == 0 {
			continue
		}
		for j := i; j < 26; j++ {
			tmpt += aCharNums[j]
		}

		for j := 0; j < i; j++ {
			tmpt += bCharNums[j]
		}

		if tmpt < min {
			min = tmpt
		}
	}

	return min
}

func SameCharacters(a string, b string) int {
	charNums := [26]int{}
	for _, ch := range a {
		charNums[ch-'a']++
	}
	for _, ch := range b {
		charNums[ch-'a']++
	}

	max := 0
	for i := 0; i < 26; i++ {
		if max < charNums[i] {
			max = charNums[i]
		}
	}

	return len(a) + len(b) - max

}
func minCharacters(a string, b string) int {
	min1, min2, min3 := LessThanMinCharacters(a, b), LessThanMinCharacters(b, a), SameCharacters(a, b)
	min := min1
	if min > min2 {
		min = min2
	}
	if min > min3 {
		min = min3
	}
	return min
}

第三题 找出第 K 大的异或坐标值

/*
1:运用异或的性质: 满足结合律和交换律, 并且a^0=a
2:前缀和的思想, 充分运用以前计算过的结果进行计算异或值
3:将二维数据转换为一维度数据进行计算, 为了使用排序算法
*/

func kthLargestValue(matrix [][]int, k int) int {
	if len(matrix) == 0 {
		return 0
	}

	m, n := len(matrix), len(matrix[0])
	xorMatrix := make([]int, m * n)

	for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			if i > 0 {
				xorMatrix[i * n + j] ^= xorMatrix[(i-1) * n + j]
			}
			if j > 0 {
				xorMatrix[i * n + j] ^= xorMatrix[i * n + j-1]
			}
			if i > 0 && j > 0 {
				xorMatrix[i * n + j] ^= xorMatrix[(i-1) * n + j-1]
			}
			xorMatrix[i * n + j] ^=  matrix[i][j]
		}
	}

	sort.Ints(xorMatrix)
	return xorMatrix[m*n-k]
}