zoukankan      html  css  js  c++  java
  • 算法101---反异或(字节跳动)

    一、题目:

    二、思路:反异或

    若a^b=c
    则a=b^c

    如:N =  7,K= 4,s = 1110100110【原来序列为1001010】

    则:

    1 2 3 4 4 4 4 3 2 1 【一共10个数】这个列表代表异或次数。

    1 0 0 1 0 1 0

       1 0 0 1 0 1 0

          1 0 0 1 0 1 0

             1 0 0 1 0 1 0

    ---------------------------

    新建两个列表,一个A,B,A表示B有没有更新过,B表示原来的列表。

    A = 【False】* N,B= 【0】 * N

    上面标红的序列可以进行以下操作:

    B[i] = int(s[i]) ^ int(s[i-1])
    B[N - i - 1] = int(s[N+K-i-2]) ^ int(s[N+K-i-1])

    标黄的可以进行以下操作:

    B[minnum + j] = B[minnum + j -1] ^ int(s[minnum + j])

    通过这两个操作来更新B。最后返回B。

    三、代码:

    N , K = map(int,input().split())
    s = input()
    def solve(s,N,K):
        if K == 0:
            print(s)
            return 
        if N == 1:
            print(s[0])
            return
        if N > 1 :
            A , B = [False] * N , [0] * N
            A[0] , A[N-1] , B[0] , B[N-1] = True , True, int(s[0]) , int(s[N+K-2])
            minnum = min(N,K)
            for i in range(1,minnum):
                if not A[i]:
                    B[i] = int(s[i]) ^ int(s[i-1])
                    A[i] = True
                if not A[N - i - 1] and i != minnum:
                    B[N - i - 1] = int(s[N+K-i-2]) ^ int(s[N+K-i-1])
                    A[N - i - 1] = True
            for j in range(N+K-2*minnum):
                if minnum + j -1 < N and not A[minnum + j -1]:
                    B[minnum + j] = B[minnum + j -1] ^ int(s[minnum + j])
            res = ""
            for i in range(N):
                res += str(B[i])
            print(res)
            return
    solve(s,N,K)
            
  • 相关阅读:
    ios input输入不了
    ios遇到的坑
    Linux搭建GitLab并汉化
    在Linux环境下tomcat 指定 jdk或jre版本
    SpringBoot设置默认首页
    解决MariaDB中文乱码
    使用Hexo+GitHub搭建免费个人博客
    Linux上安装node和npm
    Linux配置SSH Key到GitHub
    Linux安装Git
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/11336558.html
Copyright © 2011-2022 走看看