大输入数组中的奇数对XOR

时间:2015-06-06 08:22:44

标签: java arrays bit-manipulation xor

  

您将获得一个数组A1,A2 ... AN。你必须告诉多少对(i,   j)存在使得1≤i<1。 j≤N且Ai XOR Aj为奇数。

     

Input and Output第一行T,测试用例的数量。每   testcase:第一行N,后一行是N个整数。对于每一个   测试用例,在一行中打印所需的答案。

     

约束1 ≤ T ≤ 10 1 ≤ N ≤ 10^5 0 ≤ Ai ≤ 10^9

我的代码:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int totalTestCaseT = Integer.parseInt(reader.readLine());
        StringBuilder outputOddCount = new StringBuilder();

        for (int i = 0; i < totalTestCaseT; i++) {
            int lengthOinputT = Integer.parseInt(reader.readLine());
            String input = reader.readLine().trim();
            long oddXorCount = getOddXorCount(input, lengthOinputT);
            outputOddCount.append(oddXorCount);
            outputOddCount.append("\n");
        }

        System.out.println(outputOddCount);
    }

    private static long getOddXorCount(String input, int lengthOinputT) {

        String[] inputArray = input.split(" ");
        int oddCount = 0, evenCount = 0;
        for (int i = 0; i < lengthOinputT; i++) {
        String lastDigit = String.valueOf((inputArray[i]
                    .charAt(inputArray[i].length() - 1)));
            int unitDigit = Integer.parseInt(lastDigit);
            if ((unitDigit & 1) == 1) {
                oddCount++;
            } else
                evenCount++;
        }
        return oddCount * evenCount;
    }

它适用于N的某些值但不适用于大N~100000。

示例输入:Input 1 Input 2

最初我在没有任何函数的情况下编写它,主要类中的所有内容都是这样,并且它通过了所有测试

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String line = br.readLine();
    int tCases = Integer.parseInt(line);

    for (int i = 0; i < tCases; i++) {
        long oCount = 0, eCount = 0;
        int N = Integer.parseInt(br.readLine());
        String[] A = br.readLine().toString().split(" ");
        for (int j = 0; j < N; j++) {
            int unitDigit = Integer
                    .parseInt((A[j].charAt(A[j].length() - 1)) + "");
            if (unitDigit % 2 == 0)
                eCount++;
            else
                oCount++;
        }
        System.out.println(eCount * oCount);
    }

这是我的提交 1. Submission of code 1 2. Submission of code 2

2 个答案:

答案 0 :(得分:2)

在适用于所有输入的版本中,您使用long来保存计数器:

long oCount = 0, eCount = 0;

在对某些输入无效的版本中,您使用int来保存计数器:

int oddCount = 0, evenCount = 0;

也许你的int溢出了。

例如,如果偶数的数量是所有数字的一半,则oddCount和evenCount都将为50,000。 50,000 * 50,000是2,500,000,000,大于int的最大值。因此oddCount * evenCount会溢出。

答案 1 :(得分:0)

偶数和奇数的异或是奇数。

因此,在给定的数组[A1,A2 ... AN]中,找到偶数元素的总数和奇数元素的总数。

由于我们要找到具有奇数异或的所有对的数量,所以答案是总奇数元素和总偶数元素的乘法。

以下是我在PHP中的解决方案。

<?php
/**
 * Created by PhpStorm.
 * User: abhijeet
 * Date: 14/05/16
 * Time: 3:51 PM
 * https://www.hackerearth.com/problem/algorithm/sherlock-and-xor/description/
Input and Output
First line T, the number of test cases. Each test case: first line N, followed by N integers in next line. For each testcase, print the required answer in one line.
2
3
1 2 3
4
1 2 3 4
 */
fscanf(STDIN, "%d\n", $n);
while($n--) {
    fscanf(STDIN, "%d\n", $len);
    $a_temp = rtrim(fgets(STDIN), "\n\r");
    $a = explode(" ", $a_temp);
    array_walk($a, 'intval');
    $odd = 0;
    $even = 0;
    for($i=0; $i<$len; $i++) {
        if($a[$i]%2) {
            $odd++;
        } else{
            $even++;
        }
    }
    echo ($odd * $even) . "\n";
}
?>