科大讯飞笔试求教
求教各位大佬,以下代码还有什么优化空间呢?只能通过20%。
题目大意:
输入两个数(n:字符个数;q:可操作次数)和一个字符串(0和1组成)。操作是把0变成1
求 连续1的个数的平方 的和
例子:
6,1,100101 —— 输出10——对倒数第二位操作变成100111,得到1*1+3*3 = 10
10,2,0010011011 ——输出37 —— 对最后两个0操作变成0010111111,得到1*1+6*6 = 37
package main
import (
"fmt"
)
func main() {
var n,q int
fmt.Scanf("%d %d",&n, &q)
var str string
fmt.Scanf("%s",&str)
strByte := []byte(str)
if q==0{
fmt.Println(check(strByte))
return
}
maxN := 0
var helper func(int,int)
helper = func(index, stay int){
if index == n{
maxN = max(maxN, check(strByte))
return
}
if stay > 0{// 还有要做的
// 找到所有0,依次放入
for i:=index;i<n;i++{
if strByte[i]=='0'{
strByte[i] = '1'
helper(i+1,stay-1)
strByte[i] = '0'
}
}
}else{
helper(n,0)
}
// 计算全部的
}
helper(0,q)
fmt.Println(maxN)
}
func check(nums []byte)int{
total := 0
index := 0
for index<len(nums){
l, r:=0, 0
for index <len(nums) && nums[index]=='0'{
index++
}
l = index
for index <len(nums) && nums[index]=='1'{
index++
}
r = index
total += (r-l)*(r-l)
}
return total
}
func max(a,b int)(int){
if a>b{
return a
}
return b
}
#科大讯飞##笔试##golang#
查看5道真题和解析