首页 > 试题广场 >

两个数出现了奇数次

[编程题]两个数出现了奇数次
  • 热度指数:3393 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个数字arr,其中只有两个数字出现了奇数次,其它数字都出现了偶数次,按照从小到大顺序输出这两个数。

输入描述:
第一行输入一个n,
第二行输入n个数


输出描述:
输出出现奇数次的两个数,按照从小到大的顺序。
示例1

输入

4
1 1 2 3

输出

2 3
示例2

输入

6
11 22 11 23 23 45

输出

22 45
#include<iostream>
#include<vector>

using namespace std;

int main()
{
    int n, result = 0;
    cin >> n;
    vector<int> arr(n, 0);
    for (int i = 0; i < n; i++) cin >> arr[i];
    for (int i = 0; i < n; i++) result ^= arr[i];
    int rightOne = result & (~result + 1);

    int res1 = result, res2 = result;
    for (int i = 0; i < n; i++)
        if ((arr[i] & rightOne) == 0) res1 ^= arr[i];
    res2 ^= res1;
    cout << (res1 < res2 ? res1 : res2) << " " << (res1 > res2 ? res1 : res2);
    return 0;
}

编辑于 2021-06-10 22:00:30 回复(1)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] strArr = br.readLine().split(" ");
        int[] data = new int[n];
        int[] result = new int[2];
        int frist = 0;
        for (int i = 0; i < n; i++) {
            data[i] = Integer.parseInt(strArr[i]);
            frist ^= data[i];
        }
        int second = frist & (-frist);
        int val = 0;
        for (int i = 0; i < n; i++) {
            if ((data[i] & second) != 0){
                val ^= data[i];
            }
        }
        result[0] = val;
        result[1] = frist ^ val;
        Arrays.sort(result);
        System.out.println(result[0]+" "+result[1]);
    }
}


发表于 2022-05-26 12:34:20 回复(0)

问题信息

上传者:小小
难度:
2条回答 1445浏览

热门推荐

通过挑战的用户