Java 大型输入阵列中的奇数异或对

Java 大型输入阵列中的奇数异或对,java,arrays,bit-manipulation,xor,Java,Arrays,Bit Manipulation,Xor,给你一个数组A1,A2…an。你必须说出有多少对(我, j) 存在,使1≤ i

给你一个数组A1,A2…an。你必须说出有多少对(我, j) 存在,使1≤ i
输入和输出
第一行T,测试用例的数量。每个 testcase:第一行是N,下一行是N个整数。每人 testcase,在一行中打印所需答案

约束<代码>1≤ T≤ 10 1 ≤ N≤ 10^5 0 ≤ 艾岛≤ 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;
    }
BufferedReader reader=新的BufferedReader(新的InputStreamReader(System.in));
int totalTestCaseT=Integer.parseInt(reader.readLine());
StringBuilder OutputAddCount=新StringBuilder();
对于(int i=0;i
它对N的某些值有效,但对大的N~100000无效

示例输入:

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

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);
    }
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
String line=br.readLine();
int tCases=Integer.parseInt(行);
for(int i=0;i
这是我提交的两份材料 1.
2.

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

long oCount = 0, eCount = 0;
int oddCount = 0, evenCount = 0;
在不适用于某些输入的版本中,您使用
int
s来保存计数器:

long oCount = 0, eCount = 0;
int oddCount = 0, evenCount = 0;
可能您正在获得
int
溢出


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

奇偶数的异或是奇数

因此,在给定的数组[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";
}
?>


非常感谢您消除了我对退货类型的一个几乎被忽视的误解。。我的印象是,因为我返回的是
long
两个值,在相乘时保持
int
值将返回实际答案@安卡拉,不客气。这与返回类型无关。对两个整数执行数值运算时,即使将其分配给不同类型的变量,结果也是int。就像
long l=50000*50000
将溢出,
double d=2/5
将返回
0.0
(而不是一些人期望的
0.4
)。顺便说一句,如果将return语句更改为
return(long)oddCount*evenCount,您仍然可以保留计数器
int
。这将强制长数相乘,而不会溢出。您可以使用数组计数[2],而不是两个计数器偶数/奇数计数,并通过计数[unitDigit&1]++累积值;没有任何if()。