问题1:
#include <cstdio>
#include <cmath>
#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;
void xulie(int n,int arr[]){
int res=0,res1=0;
for(int i=0;i<n;i++){//所有数异或,此时偶数消为0,res为两个奇数异或的结果
res=res^arr[i];
}
//提取最右边的1
int rightOne=res&(~res+1);
//只将指定位数有1的数据进行异或(对于偶数个数的数据依然消为0,而对于奇数个数的数只会选到其中一个,这样res1最后就是其中的一个奇数了)
for(int j=0;j<10;j++){
if((arr[j]&rightOne)==rightOne){
res1=res1^arr[j];
}
}
cout<<"a="<<res1<<",b="<<(res1^res);
}
int main() {
int n;
int arr[100];
cin>>n;
for(int i=0;i<n;i++){
cin>>arr[i];
}
xulie(n,arr);
}
这题有点好玩,学习了①.位运算的(与)和(异或)
②.如何取最后一位非零数
问题2::局部最小值问题(给出一串数据,找到其中的一个局部最小值)
这题有点意思,不一定有序才能有二分
#include<iostream>
#include <algorithm>
#include<vector>
using namespace std;
int binary(vector<int> arr,int left,int right){
int mid=(left+right)/2;
while(1){
if(arr[mid-1]>=arr[mid]&&arr[mid+1]>=arr[mid])//如果局部最优
return mid;
else if(arr[mid-1]<arr[mid]){//如果左边小,往左边走
right=mid;
mid=(left+mid)>>1;
}else if(arr[mid+1]<arr[mid]){//如果右边小,往右边走
left=mid;
mid=(right+mid)>>1;
}
}
}
int main() {
int n;
cin>>n;
int temp;
vector<int> arr;
for(int i=0;i<n;i++){
cin>>temp;
arr.push_back(temp);
}
if(arr[0]<=arr[1])//端点处理
cout<< 0;
else if(arr[n-1]<=arr[n-2])
cout<<(n-1);
else{cout<<binary(arr,0,n-1);}//二分查找
}