2022-01-08:数组中只有0和1,每过1代,0旁边只有1个1,当前0会变成1。每过1代,0旁边有2个1,当前0还是0。 比如10001,经过1代,会变成11011,再过1代,还是11011 。

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-01-08:数组中只有0和1,每过1代,0旁边只有1个1,当前0会变成1。每过1代,0旁边有2个1,当前0还是0。 比如10001,经过1代,会变成11011,再过1代,还是11011 。相关的知识,希望对你有一定的参考价值。

2022-01-08:数组中只有0和1,每过1代,0旁边只有1个1,当前0会变成1。每过1代,0旁边有2个1,当前0还是0。
比如10001,经过1代,会变成11011,再过1代,还是11011 。
求一个数组经过M代以后的数组。函数定义是void f(int[] arr,int m) 。

答案2022-01-08:

x里有有限个0。
1x1,中间0,x中有2m个0变成1,最中间的0不会变成1。
1x,右0,x中有m个0变成1。
x1,左0,x中有m个0变成1。
时间复杂度:O(N)。
空间复杂度:O(1)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() 
    arr := []byte0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0
    f(arr, 2)
    fmt.Println(arr)


func f(arr []byte, m int) 
    //找中间0
    oneIndexList := make([]int, 0)
    for i, a := range arr 
        if len(oneIndexList) == 2 
            oneIndexList = oneIndexList[1:]
        
        if a == 1 
            oneIndexList = append(oneIndexList, i)
        
        if len(oneIndexList) == 2 
            for j := oneIndexList[0] + 1; j <= oneIndexList[1]-1; j++ 
                if j-oneIndexList[0] != oneIndexList[1]-j &&
                    (j-oneIndexList[0] <= m ||
                        oneIndexList[1]-j <= m) 
                    arr[j] = 1
                
            
        
    

    //找左0
    oneLeftIndex := 0
    for i, a := range arr 
        if a == 1 
            oneLeftIndex = i
            break
        
    
    if oneLeftIndex > 0 
        left := oneLeftIndex - m
        right := oneLeftIndex - 1
        if left < 0 
            left = 0
        
        for i := left; i <= right; i++ 
            arr[i] = 1
        
    

    //找右0
    oneRightIndex := len(arr) - 1
    for i := oneRightIndex; i >= 0; i-- 
        a := arr[i]
        if a == 1 
            oneRightIndex = i
            break
        
    
    if oneRightIndex < len(arr)-1 
        left := oneRightIndex + 1
        right := oneRightIndex + m
        if right > len(arr)-1 
            right = len(arr) - 1
        
        for i := left; i <= right; i++ 
            arr[i] = 1
        
    

执行结果如下:


题目来自左神,代码是自己写的。

以上是关于2022-01-08:数组中只有0和1,每过1代,0旁边只有1个1,当前0会变成1。每过1代,0旁边有2个1,当前0还是0。 比如10001,经过1代,会变成11011,再过1代,还是11011 。的主要内容,如果未能解决你的问题,请参考以下文章

2021-06-26:给定一个只有0和1组成的二维数组,返回边框全是1的最大正方形面积。

三指针(三指针排序只有三种元素的数组)--12--三指针--颜色分类

为啥只有数组的第一个元素被初始化为-1?而其余的都是0 [重复]

旋转数组的最小数字

2023-01-12:一个n*n的二维数组中,只有0和1两种值, 当你决定在某个位置操作一次, 那么该位置的行和列整体都会变成1,不管之前是什么状态。 返回让所有值全变成1,最少的操作次数。 1 <

2023-01-12:一个n*n的二维数组中,只有0和1两种值, 当你决定在某个位置操作一次, 那么该位置的行和列整体都会变成1,不管之前是什么状态。 返回让所有值全变成1,最少的操作次数。 1 <