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