
2026-06-20:重新排列后的最大按位异或值。用go语言,给定两个长度都为 n 的二进制字符串 s 和 t。
你可以把 t 的字符任意顺序重排,但 s 不能改动。
然后把 s 和重排后的 t 按位做异或运算,得到一个新的二进制串。
你的任务是:在所有可能的重排方式中,找出使这个异或结果对应的“二进制整数值”最大的那一种,并返回对应的异或结果字符串。
1 <= n == s.length == t.length <= 200000。
s[i] 和 t[i] 不是 '0' 就是 '1'。
输入: s = "101", t = "011"。
输出: "110"。
解释:
t 的一个最佳重新排列方式是 "011"。
s 与重新排列后的 t 进行按位异或的结果是 "101" XOR "011" = "110",这是可能的最大值。
题目来自力扣3849。
s、t,长度均为 n;s 顺序固定,仅能对 t 的 0、1 字符自由重排;s[i] XOR t_new[i],每一位结果规则:'0' 的总数 cnt0;cnt0 得到 cnt1(t 中 '1' 的总数);left = [剩余0数量, 剩余1数量] 保存 t 还未使用的 0、1,初始值为统计出来的 cnt0、cnt1。
样例 t="011":直接把 s 复制到字节切片 ans,后续逐位确定每一位异或输出,最终转字符串返回;
样例 ans 初始为 ['1','0','1']。
遍历每一个下标 i,取出当前 s 的本位数字 x(0 或 1),目标优先让当前异或结果等于 1:
0:想要异或出1,需要从剩余t中拿一个1;1:想要异或出1,需要从剩余t中拿一个0;
对应代码中 x ^ 1:和 x 相反的数字(0变1,1变0)。分两种分支处理每一位:
left[x^1] -= 1;'1',存入 ans[i];left[x] -= 1;'0',存入 ans[i]。第1位 i=0,s字符='1',x=1:
x^1=0,left[0]=1 > 0;['1','0','1']第2位 i=1,s字符='0',x=0:
x^1=1,left[1]=2 > 0;['1','1','1']第3位 i=2,s字符='1',x=1:
x^1=0,left[0]=0,无剩余0;['1','1','0']样例最终得到字符串 "110",和题目输出一致。
n 为字符串长度:
额外开辟的内存:
补充说明:如果题目允许直接复用输入内存,仅常数空间;但代码中新建了独立的字节切片存储答案,因此额外空间由结果数组主导,为线性O(n)。
.
package main
import (
"fmt"
"strings"
)
func maximumXor(s, t string)string {
cnt0 := strings.Count(t, "0")
left := [2]int{cnt0, len(t) - cnt0} // t 中剩余的 0 和 1 的个数
ans := []byte(s)
for i, ch := range ans {
x := int(ch - '0')
// 如果 x 是 0,那就看还有没有剩下的 1
// 如果 x 是 1,那就看还有没有剩下的 0
if left[x^1] > 0 {
left[x^1]--
ans[i] = '1'// x ^ (x^1) = 1
} else { // 只能让两个相同的数异或
left[x]--
ans[i] = '0'// x ^ x = 0
}
}
returnstring(ans)
}
func main() {
s := "101"
t := "011"
result := maximumXor(s, t)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def maximum_xor(s: str, t: str) -> str:
cnt0 = t.count("0")
left = [cnt0, len(t) - cnt0] # t 中剩余的 0 和 1 的个数
ans = list(s)
for i, ch in enumerate(ans):
x = int(ch)
# 如果 x 是 0,那就看还有没有剩下的 1
# 如果 x 是 1,那就看还有没有剩下的 0
if left[x ^ 1] > 0:
left[x ^ 1] -= 1
ans[i] = '1' # x ^ (x^1) = 1
else: # 只能让两个相同的数异或
left[x] -= 1
ans[i] = '0' # x ^ x = 0
return''.join(ans)
if __name__ == "__main__":
s = "101"
t = "011"
result = maximum_xor(s, t)
print(result)
.
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string maximumXor(string s, string t) {
int cnt0 = count(t.begin(), t.end(), '0');
int left[2] = {cnt0, (int)t.length() - cnt0}; // t 中剩余的 0 和 1 的个数
string ans = s;
for (int i = 0; i < (int)ans.length(); i++) {
int x = ans[i] - '0';
// 如果 x 是 0,那就看还有没有剩下的 1
// 如果 x 是 1,那就看还有没有剩下的 0
if (left[x ^ 1] > 0) {
left[x ^ 1]--;
ans[i] = '1'; // x ^ (x^1) = 1
} else { // 只能让两个相同的数异或
left[x]--;
ans[i] = '0'; // x ^ x = 0
}
}
return ans;
}
int main() {
string s = "101";
string t = "011";
string result = maximumXor(s, t);
cout << result << endl;
return0;
}
