[编程题]病毒检测
最近在集中刷题,全部都写的话有点费时间,以后就只记录做得比较困难了。
这道题一入眼我首先想到的是双指针,但是仔细考虑一下发现左右指针轮流右移的思路行不通,如果一定要用双指针,需要右指针扫描完了回到起点再操作,这就和暴力法没什么区别了。
我想到另一种思路,创建一个数组pos[]记录每个1的位置。
我们结合一个例子来分析一下一般情形,针对如下的pos[]:
2 4 9 10 14 18
考虑第5个1,位置是14,假如k=3,第2个1的位置是4。
那么包含9,10,11这三个1的所有可能性可以表示为:
右侧滑动范围(14,18],左侧滑动范围((4,9],可能性有(18-14)*(9-4)=20种。
然后改变末位1的位置求得总共的可能性。
下附代码:
package main
import "fmt"
func main() {
var k,ans int
var str string
fmt.Scan(&k,&str)
pos:= []int{-1}
for i,v:=range(str){
if v==49{ //"1"的ASCII码为49
pos=append(pos, i)
}
}
if k>=len(pos){
fmt.Println(0)
return
}
pos=append(pos, len(str))
if k==0{
for i:=k;i<len(pos)-1;i++{
ans+=(pos[i+1]-pos[i]-1)*(pos[i+1]-pos[i])/2
}
}else {
for i := k; i < len(pos)-1; i++ {
ans += (pos[i+1] - pos[i]) * (pos[i-k+1] - pos[i-k])
}
}
fmt.Println(ans)
}