数组荒诞挑战

时间:2011-08-13 14:08:58

标签: java

所以,我一直在研究以下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);

    }

}

3 个答案:

答案 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];
    }
}