异或和或
对于一个长度为 n 的01序列 a1,a2,…,an。
你可以执行以下操作任意多次:
-
选择两个下标 1≤i,j≤n(i≠j)
-
记x=ai xor aj , y=ai or aj , 其中 xor表示按位异或 , or 表示按位或。
-
然后令 ai=x,aj=y或 ai=y,aj=x。
给定两个01序列 s,t , 请你判断是否可以通过有限次(可以为00次)操作将序列 s 变为 t。
输入格式
第一行一个整数 t , 表示数据的组数(1≤t≤10^3)。接下来 t组数据:
每组第一行一个01字符串 s(1≤|s|≤10^3),每组第二行一个0101字符串 t(1≤|t|≤10^3)
注意:|s|可能不等于 |t|。
输出格式
如果可以通过有限次(可以为00次)操作将序列 s 变为 t , 输出 YES
, 否则输出 NO
。
样例输入
2
001
011
11
101
样例输出
YES
NO
样例解释
第一组数据选择 i=2,j=3 , 那么 x=1,y=1, 接着令 ai=x,aj=y 即可得到 t 序列。
第二组数据 |s|=2,|t|=3 显然无法满足要求。
对于这题我唯一看懂的就是两个01字符长度如果不相同就不满足要求,其它的不是很懂
对与任意选的两个数总共有 进行异或运算 和 或运算(异或运算,相同为0,相异为1)
00 x=0,y=0 或x=0,y=0
01 x=1,y=1或 x=1,y=1
10 x=1,y=1或 x=1 ,y=1
11 x=0,y=1 或x=1,y=0
四种可能
所以说 只要选择的01序列,旁边有1,另一个数就可以进行变化,也就是一个01序列里面
只要有1 ,我就可以让其它的位置上的数进行变换,所以长度相同是第一必要的
接着就是看两个序列是不是都有1,如果都有1,那么这两个序列就能相互转换,一个序列不论怎么进行转换都会剩下一个1,只要它一开始有1,所以,我们只需要对两个序列先判断长度,再判断他们是不是都有1就可以了
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
string a,b;
while(t--){
cin>>a>>b;
int na=a.length();//异或运算,相异为1,相同为0
int nb=b.length();//或运算,只要有一个是1,就是1
if(na!=nb){
cout<<"NO"<<endl;
continue;
}
int one=0,zero=0,one1=0,zero1=0;
for(int i=0;i<na;i++){
if(a[i]-'0'==0) zero++;
else one++;
}
for(int i=0;i<nb;i++){
if(b[i]-'0'==0) zero1++;
else one1++;
}
if(one&&!one1){//第一个字符串里面有1,第二个字符串里面没有1
cout<<"NO"<<endl;
}
else if(!one&&one1){
cout<<"NO"<<endl;
}
else if(one&&one1){
cout<<"YES"<<endl;
}
else cout<<"YES"<<endl;
}
return 0;
}
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入:nums = [1,2,3,4] 输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 50000
0 <= nums[i] <= 10000
我们得到一个整数数组,题目要求我们调整数组顺序,使得前半部分都是奇数,后半部分都是偶数.
我们可以新建一个等长的数组,把数组中所有的奇数放在前半部分,再把所有的偶数放在后半部分
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int len = nums.size();
if(len==0){
return nums;
}
int arr[len];
int tem=0;
for(int i=0;i<len;i++){
arr[i]=nums[i];
}
for(int i=0;i<len;i++){
if(arr[i]%2!=0){
nums[tem]=arr[i];
tem++;
}
}
for(int i=0;i<len;i++){
if(arr[i]%2==0){
nums[tem]=arr[i];
tem++;
}
}
return nums;
}
};
也可以两边开始找奇数和偶数,再互换位置