美文网首页
字节跳动2019-8-11笔试

字节跳动2019-8-11笔试

作者: 今天不想掉头发 | 来源:发表于2019-08-11 23:00 被阅读0次

第二题:
小明和小红采用密码加密通信,每次通信有固定的明文长度n和加密次数k。

比如:密码二进制明文是1001010,加密次数是4,则每次将密文右移1位与明文做异或操作,总共位移3次(k=4, 所以k - 1 = 3)

输入:

7 4 // n k
1110100110 //密文

输出:
1001010 //明文

解释:

1001010
1001010
1001010
1001010
加密次数为4,故对于明文右移4-1=3轮,每轮与当前密文进行一次异或,故1001010对应密文为1110100110

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, k, tmp;
    string s, ans = "";
    cin >> n >> k;
    cin >> s;
    ans += s[0];
    // 从前往后异或,取前k个数
    for (int i = 1; i < k; i++) {
        tmp = (int) (s[i] - '0') ^ (int) (s[i - 1] - '0');
        ans += tmp + '0';
    }
    // s[i - 1]是1,2,3,4的异或,而s[i]是2,3,4,5的异或,所以下面的异或式子就是计算第5个数(其中ans[i - k]是第一个数)
    for (int i = k; i < n; i++) {
        ans += (int) (s[i] - '0') ^ (int) (s[i - 1] - '0') ^ (int) (ans[i - k] - '0') + '0';
    }
    cout << ans;
    return 0;
}

相关文章

网友评论

      本文标题:字节跳动2019-8-11笔试

      本文链接:https://www.haomeiwen.com/subject/qmyejctx.html