2011-08-13 21 views
0

私は次のようなコード挑戦問題に取り組んでいます。アレイの不合理な挑戦

アレイ不条理

説明:

我々は包括0からN-2の範囲の整数、で満たされることを知って、サイズNの不変の配列を持っている想像してみてください。配列に正確に複製されたエントリが1つあり、その複製が正確に2回現れることがわかったとします。重複したエントリを探します。

(ボーナスポイントの場合は、あなたのソリューションは、Nに比例定数空間と時間があることを確認)入力サンプル:

あなたのプログラムは、最初の引数としてファイル名へのパスを受け入れる必要があります。このファイルの各行は1つのテストケースです。すべての空行を無視します。各行は、正の整数(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 

出力サンプル:

が印刷アウト重複エントリを、新しいラインなどの各1

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); 

    } 

} 

答えて

6

あなたのプログラムは、最初の引数としてファイル名へのパスを受け入れる必要があります。

プログラムは、コマンドラインではなくSystem.inからファイル名を読み取るようです。コマンドライン引数では何もしません。

私はコードの残りの部分を注意深く見ていませんが、これはプライマリ問題のロジックが正しい場合であってもそれを無効にする可能性があるようです。

+0

ええ、それはちょうどそのキーの要件が不足しているようですね。 'Scanner sc = new Scanner(System.in);を置き換えてみてください。文字列filename = sc.nextLine(); String [] [] arr = readNumbers(filename); '' String [] [] arr = readNumbers(argv [1]); '。 – redbmk

+0

ありがとうございました。いくつかのことを教えてくれますが、これは問題がどこにあるかのようです:) –

+0

Yay! –

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); 
    } 
} 
+0

これはきれいです。ありがとう。しかし、Logicは私の問題ではない、私はそれが正しいファイルパスを読み取ることができないので失敗していると思うか、いくつかの最終的なケースでは失敗します。しかし、これは間違いなく、より洗練されたバージョンです! –

+0

あなたはint numの計算とそれがどのように機能するかを少し説明できますか? – adit

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]; 
    } 
} 
関連する問題