欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2n+1个数中有2n个数出现过两次,找出其中只出现一次的数

程序员文章站 2024-03-16 18:11:16
...
public static void main(String[] args) {

    // 数字6只出现一次
    int[] arr = {5, 7, 12, 34, 20, 7, 20, 6, 12, 5, 34};

    int size = arr.length;
    int k = 0;
    for (int i = 0 ; i < size; i++) {
        k ^= arr[i];
    }
    System.out.println(k);
}

原理 异或
相同为0
相异为1
任何数与0异或的结果仍是自身

交错正负数

public class MyMain {

    public static void main(String[] args) {

        int[] arr = {-2, 34, 88, -33, -45, 2, 70, -56};

        stepA(arr);
        stepB(arr);

        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ",");
        }

    }

    // 排序 负数在前正数在后 类似简单选择排序
    public static void stepA(int[] array) {

        int size = array.length;

        int out;
        int in;

        for (out = 0; out < size -1 ; out++) {
            for (in = out + 1; in < size; in++) {
                if (array[in] < 0) {
                    array[out] = array[in] ^ array[out];
                    array[in] = array[out] ^ array[in];
                    array[out] = array[out] ^ array[in];
                    break;
                }
            }
        }
    }

    // 头尾交换
    public static void stepB(int[] array) {
        int size = array.length;
        for (int i = 1; i< size / 2;) {
            array[i] = array[i] ^ array[size - 1 - i];
            array[size - 1 - i] = array[i] ^ array[size - 1 - i];
            array[i] = array[i] ^ array[size - 1 - i];
            i = i + 2; // 步长
        }
    }
}

判断一组数中是否存在某个数

public static void main(String[] args) {

    int[] arr = {5, 17, 122, 304, 20, 7, 20, 6, 12, 5, 34};

    int size = arr.length;
    // 待匹配数字
    int k = 12;

    for (int i = 0 ; i < size; i++) {
        if ((k ^ arr[i]) == 0) {
            System.out.println("匹配成功");
            break;
        }
    }
}

原理 异或
相同为0
相异为1

相关标签: 其他