所以,我一直在研究以下codeeval挑战问题。
数组荒谬
说明
想象一下,我们有一个大小为N的不可变数组,我们知道这些数组用0到N-2(包括0和N-2)的整数填充。假设我们知道该数组只包含一个重复的条目,并且该副本恰好出现两次。找到重复的条目。 (对于奖励积分,确保您的解决方案具有与N成比例的恒定空间和时间)
输入样本:
您的程序应该接受文件名路径作为其第一个参数。此文件中的每一行都是一个测试用例。忽略所有空行。每行以正整数(N)开始,即数组的大小,然后是分号,后跟逗号分隔的正数列表,范围从0到N-2,包括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);
}
}
答案 0 :(得分:7)
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);
}
}
答案 1 :(得分:6)
您的程序应该接受文件名路径作为其第一个参数。
您的程序看起来像是从System.in而不是从命令行读取文件名。它对命令行参数没有任何作用。
我没有仔细查看其余的代码,但即使主要问题的逻辑是正确的,这似乎也可能使其失去资格。
答案 2 :(得分:0)
这是在perl中执行此操作的基本方法。
#!/usr/bin/perl -w
use strict;
open FILE, $ARGV[0] or die $!;
local $| = 1;
local $, = '';
while (<FILE>) {
$_ =~ /(\d+);(.*)/;
my $len = $1;
my @nums = sort split /,/, $2;
for(0 .. $len) {
print $nums[$_], "\n" and last if $nums[$_] == $nums[$_ + 1];
}
}