java - 数组荒谬挑战

标签 java

所以,我一直在研究以下代码评估挑战问题。

数组荒谬

描述:

假设我们有一个大小为 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/

相关文章:

java - 通过特定ID同步锁

java - 如何统计关键人物?

java - 有什么方法可以对采用 MediaType.MULTIPART_FORM_DATA 进行文件上传的休息服务进行 junit 测试吗?

javascript - 运行 Javascript 函数来填充表格,然后使用 Jsoup 解析 HTML 页面

java - Gradle 返回包不存在

java - Eclipse - org.junit 无法解析,即使它在 Maven 依赖项中

java - 模拟 ProceedingJoinPoint 签名

java - 无法删除 jackrabbit 中的节点

java - 在 JAXB 中解码期间忽略未定义的元素引用

java - 在 Tomcat 上运行的 Web 应用程序的登录页面