week 1

异或和或

对于一个长度为 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] 也是正确的答案之一。

提示:

  1. 0 <= nums.length <= 50000
  2. 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;
    }
};

也可以两边开始找奇数和偶数,再互换位置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值