私は次のようなコード挑戦問題に取り組んでいます。アレイの不合理な挑戦
アレイ不条理
説明:
我々は包括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);
}
}
ええ、それはちょうどそのキーの要件が不足しているようですね。 'Scanner sc = new Scanner(System.in);を置き換えてみてください。文字列filename = sc.nextLine(); String [] [] arr = readNumbers(filename); '' String [] [] arr = readNumbers(argv [1]); '。 – redbmk
ありがとうございました。いくつかのことを教えてくれますが、これは問題がどこにあるかのようです:) –
Yay! –