所以,我一直在研究以下代码评估挑战问题。
数组荒谬
描述:
假设我们有一个大小为 N 的不可变数组,我们知道它填充了 0 到 N-2(含)范围内的整数。假设我们知道该数组恰好包含一个重复的条目,并且该重复项恰好出现两次。找到重复的条目。 (为了获得奖励积分,请确保您的解决方案具有与 N 成正比的恒定空间和时间)
输入示例:
您的程序应该接受文件名路径作为其第一个参数。该文件中的每一行都是一个测试用例。忽略所有空行。每行以正整数 (N) 开头,即数组的大小,然后是分号,后面是逗号分隔的正数列表,范围从 0 到 N-2(含)。即例如。
5;0,1,2,3,0
20;0,1,10,3,2,4,5,7,6,8,11,9,15,12,13,4,16,18,17,14
输出示例:
打印出重复的条目,每个条目占一个新行,例如
0
4
在文件中提交您的解决方案(某些文件名)。(py| c| cpp| rb| pl| php| tcl| clj| js) | array_absurdity.java 或使用在线编辑器。
我觉得这很容易。我对其进行了编码,并在我的计算机上使用各种测试用例对其进行了测试,它似乎工作正常。但是当我在 codeveal 上提交问题时,我一直得到 0。我已经想到了所有可能的测试用例,但不知道为什么它总是失败。如果你们能提供一些想法,我将不胜感激。我编写的以下解决方案是用java编写的。
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;
public class array_absurdity {
public static int findDuplicate(int [] arr){
int sumAll = 0;
int sumEle = sumElements(arr.length-2);
for(int i = 0; i < arr.length; i++){
sumAll += arr[i];
}
if(sumAll < sumEle)
return 0;
else
return (sumAll - sumEle);
}
public static int sumElements (int length){
/*
if(length == 0)
return 0;
else
return length + sumElements(length - 1);
*/
return length* (length + 1)/2;
}
static String[][] readNumbers (String fileName)
{
String [][] arr;
try {
LinkedList<String> stringList = new LinkedList<String>();
Scanner scanner = new Scanner (new FileReader (fileName));
while(scanner.hasNext()){
String input = scanner.next();
stringList.add(input);
}
Iterator<String> iter = stringList.iterator();
arr = new String [stringList.size()][];
int i = 0;
while(iter.hasNext()){
arr[i] = new String[2];
try{
arr[i] = iter.next().split(";");
}
catch (Exception e){
System.out.println (e);
System.exit (0);
}
i++;
}
// Done.
return arr;
}
catch (IOException e) {
System.out.println (e);
System.exit (0);
return null;
}
catch( ArrayIndexOutOfBoundsException e ) {
System.out.println (e);
System.exit (0);
return null;
}
}
public static void main (String[] argv){
int [] iArr;
String [] ele;
Scanner sc = new Scanner(System.in);
String filename = sc.nextLine();
String [][] arr = readNumbers (filename);
int size = 0;
for(int i = 0; i< arr.length; i++){
try{
ele = arr[i][1].split(",");
size = Integer.parseInt(arr[i][0]);
iArr = new int[ele.length];
if(size == iArr.length){
int duplicate = 0;
for (int j=0; j < ele.length; j++) {
iArr[j] = Integer.parseInt(ele[j]);
duplicate = findDuplicate(iArr);
}
System.out.println(duplicate);
}
}
catch( ArrayIndexOutOfBoundsException e ) {
System.out.println (e);
System.exit (0);
}
catch (Exception e) {
System.out.println (e);
System.exit (0);
}
}
System.exit(0);
}
}
最佳答案
Java 中的较短版本。
public static void main(String... args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(args[0]));
for (String line; ((line = br.readLine()) != null); ) {
String[] parts = line.split(";")[1].split(",");
int num = (parts.length - 2) * (parts.length - 1) / 2;
for (String part : parts) num -= Integer.parseInt(part);
System.out.println(-num);
}
}
关于java - 数组荒谬挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7050909/