[Preguntas programación] detección de virus
Recientemente se centró preguntas cepillo, escribirlo todo un poco lento, ya que sólo hace más difícil registros.
Esta pregunta es un agradable a la vista Mi primer pensamiento es un dos-puntos, pero tenga en cuenta encontrar cuidadosamente la manera correcta de pensar acerca de las vueltas del puntero no va a funcionar, si usamos el doble puntero, necesitas la parte posterior del puntero derecho de la operación de exploración de nuevo acababa de comenzar, y esta violencia la ley no hay diferencia.
Pensé en otra idea, crear un punto de venta de la matriz [] registrar la ubicación de cada 1.
Combinamos un ejemplo para analizar el caso general, por las siguientes POS []:
2 4 9 10 14 18
Considere la quinta, la posición 14, si k = 3, la segunda posición es 1 4.
Todas estas tres posibilidades a continuación, contienen 1, 10, 11 se puede expresar como:
derecho deslizante rango (14, 18], el rango de deslizamiento izquierda ((4,9], existe la posibilidad de (18-14) * ( 9-4) = 20 clases.
entonces la posibilidad de cambiar la última posición de bit 1 del total determinada.
Código de fijación inferior:
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)
}