输入包含两行,第一行一个整数n,代表数组arr的长度,第二行n个整数,代表数组arr,arr[i]为32位整数。
输出出现奇数次的两个数,按照从小到大的顺序。
4 1 1 2 3
2 3
6 11 22 11 23 23 45
22 45
时间复杂度,额外空间复杂度
。
#include<iostream>
int main() {
int n, temp = 0, bit, res1 = 0, res2 = 0;
std::cin >> n;
int array[n];
for (int i = 0; i < n; ++i) std::cin >> array[i];
for (int i = 0; i < n; ++i) temp ^= array[i];
bit = temp & (~temp + 1);
for (int i = 0; i < n; ++i) {
if ((bit & array[i]) == 0) res1 ^= array[i];
else res2 ^= array[i];
}
std::cout << (res1 < res2 ? res1 : res2)
<< " " << (res1 > res2 ? res1 : res2);
return 0;
} import java.util.Scanner;
import java.util.Arrays;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
Arrays.sort(arr);
for(int i=0;i<n-1;){
if(arr[i]!=arr[i+1]){
System.out.print(arr[i]+" ");
break;
}
i=i+2;
}
for(int i=n-1;i>1;){
if(arr[i]!=arr[i-1]){
System.out.print(arr[i]);
break;
}
i=i-2;
}
}
} import java.util.*;
public class Main2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int retExclusive = 0;
for (int i = 0; i <n ; i++) {
retExclusive^=arr[i];
}
int index = findIndex(retExclusive);
int num1 = 0;
int num2 = 0;
for (int i = 0; i <n ; i++) {
if (judgeIndex(arr[i],index)){
num1^=arr[i];
}else{
num2^=arr[i];
}
}
if (num1<num2){
System.out.println(num1+" "+num2);
}else{
System.out.println(num2+ " " + num1);
}
}
}
public static int findIndex(int num){
//在整数num中找到最右边是1的位置
int index = 0;
while ((num&1)==0){
num>>=1;
index++;
}
return index;
}
public static boolean judgeIndex(int num,int index){
//判断整数num右边第num位是否为1
num>>=index;
return ((num&1)==1);
}
}
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, s=0, t=0, x=0, y=0;
scanf("%d", &n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d", &a[i]);
s ^= a[i];
}
t = s & (-s);
for(int i=0;i<n;i++)
if(a[i] & t)
x ^= a[i];
x = min(x, x^s);
y = max(x, x^s);
printf("%d %d\n", x, y);
return 0;
} import java.util.*;
public class Main {
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int[] res = getOnceNum(arr);
System.out.println(res[0] + " " + res[1]);
sc.close();
}
public static int[] getOnceNum (int[] arr) {
int eor = 0;
//因为a ^ a = 0, 所以所有出现偶数次的数都被消掉了,
//剩下的eor结果为A ^ B (A与B为只出现奇数次的数)
for (int cur : arr) {
eor ^= cur;
}
int[] res = new int[2];
//因为两者不等,异或肯定不为0,找出结果中最右的1
int rightOne = eor & (~eor + 1);
int eorOne = 0;
//异或结果在某一位为1的前提是A与B在该位置不同,找出在那个位置为1的数
//在那个位置为1的出现奇数次的数只有一个,其他出现偶数次的数都会被消掉
for (int cur : arr) {
if ((cur & rightOne) != 0) {
eorOne ^= cur;
}
}
//若a ^ b = c,则a = c ^ b 且 b = c ^ a
int eorZero = eor ^ eorOne;
res[0] = eorZero > eorOne ? eorOne : eorZero;
res[1] = res[0] == eorZero ? eorOne : eorZero;
return res;
}
} import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Question1 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); ArrayList<Integer> arrayList = new ArrayList<>(); ArrayList<Integer> result = new ArrayList<>(); int n = scanner.nextInt(); for(int i = 0;i < n;i++) { arrayList.add(scanner.nextInt()); } Collections.sort(arrayList); int a = arrayList.get(0); int flag = 0; int j = 0; while(j < n) { while (j < n && a == arrayList.get(j)) { flag++; j++; } if(flag % 2 == 1) { result.add(arrayList.get(j - 1)); } if(j < n) { a = arrayList.get(j); } flag = 0; } System.out.println(result.get(0) + " " + result.get(1)); } }
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()){
int n = in.nextInt();
int[]num = new int[n];
int[]num1 = new int[2];
Map<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < n ; i++) {
num[i] = in.nextInt();
}
for (int j = 0; j < n ; j++) {
if(map.containsKey(num[j])){
map.put(num[j],map.get(num[j])+1);
}else {
map.put(num[j],1);
}
}
int k =0;
for (Integer key:map.keySet()) {
if(map.get(key)%2!=0){
num1[k] = key;
k++;
}
}
Arrays.sort(num1);
String a ="";
a =num1[0]+" "+num1[1];
System.out.println(a);
}
}
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int array[] = new int[n];
for(int i = 0; i<n; i++){
array[i] = sc.nextInt();
}
int ret = 0;
for(int x:array){
ret^=x;
}
int i = 0;
for(;i<32;i++){
if((ret&(1<<i))==1)
break;
}
int a = 0; int b = 0;
for(int x:array){
if((x&(1<<i))==1){
a^=x;
}else{
b^=x;
}
}
if(a<b){
System.out.println(a+" "+b);
}else{
System.out.println(b+" "+a);
}
}
}
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n,t;
int x=0;
int in=1;
int y=0,z=0;
vector<int> vec;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>t;
vec.push_back(t);
}
for(int i=0;i<n;i++)
x^=vec[i];
while((x&1)==0)//得到两奇数次的数字在哪一位不相同
{
in<<=1;
x>>=1;
}
for(int i=0;i<n;i++)//将原数组分成两部分,分别得到数字
{
if((vec[i]&in)==0)
y^=vec[i];
else
z^=vec[i];
}
if(y>z)//从小到大排序
{
y=y^z;
z=y^z;
y=y^z;
}
cout<<y<<" "<<z;
return 0;
} import java.util.Scanner;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
//这块不是很懂,使用nextInt接收个数时,还未输入具体数字 nextLine后面的代码也会执行
String s=sc.nextLine();
String s1=sc.nextLine();
String[] ss=s1.split(" ");
Map<String,Integer> mm=new HashMap<String,Integer>();
for(int i=0;i<ss.length;i++){
//偶数最终将不在map中
if(mm.containsKey(ss[i])){
mm.remove(ss[i]);
}else{
mm.put(ss[i],1);
}
}
Set<Entry<String,Integer>> es=mm.entrySet();
int [] arr=new int[2];
for(Map.Entry<String,Integer> en:es){
if(arr[0]==0){
arr[0]=Integer.parseInt(en.getKey());
}else{
arr[1]=Integer.parseInt(en.getKey());
}
}
if(arr[0]>arr[1]){
arr[0]=arr[0]^arr[1];
arr[1]=arr[0]^arr[1];
arr[0]=arr[0]^arr[1];
}
System.out.println(arr[0]+" "+arr[1]);
}
}
}