输入包含两行,第一行一个整数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]); } } }