第一题: 替换隐藏数字得到的最晚时间
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]
}