削减棍棒:Hackerrank热身挑战

时间:2014-10-03 06:27:56

标签: java arrays

我一直在努力解决Hackerrank的热身挑战。对于这个特殊的挑战 - https://www.hackerrank.com/challenges/cut-the-sticks - 我已经编写了一些代码,尽管从逻辑上讲它对我来说是正确的,但我得不到正确答案。

我的代码 -

import java.util.*;

public class Solution {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();

        int lengths[] = new int[n];
        List<Integer> output = new LinkedList<Integer>();

        for (int i = 0; i < n; i++)
            lengths[i] = sc.nextInt();

        sc.close();
        Arrays.sort(lengths);

        for (int i = 0; i < n; i++) {
            if (lengths[i] == 0)
                continue;
            else {
                output.add(n - i);
                for (int j = i; j < n; j++) {    // This loop isn't working like it should
                    lengths[j] -= lengths[i];
                 // System.out.print(lengths[j] + " ");  // For debugging purposes
                }
             // System.out.println("");
            }
        }

        for (int i = 0; i < output.size(); i++)
            System.out.println(output.get(i));
    }
}

对于以下输入 -

6
5 4 4 2 8 2

我得到的输出是 -

6
5
4
3
2
1

正确的输出应为 -

6
4
2
1

我试图在代码中标记的for循环的运行中显示长度数组的值(带注释),这就是我得到的相同输入 -

0 2 4 4 5 8 
0 4 4 5 8 
0 4 5 8 
0 5 8 
0 8 
0 
6
5
4
3
2
1

我完全不知道为什么会这样。

6 个答案:

答案 0 :(得分:1)

问题在于:

lengths[j] -= lengths[i];

i == j为真时,会更改lengths[i]的值。您需要先保存该值。

 final int v = lengths[i];
 for (int j = i; j < n; j++) {
     lengths[j] -= v;
 }

答案 1 :(得分:0)

有一段时间它已经解决了。

这是一个使用do while循环的答案版本

a

答案 2 :(得分:0)

  package com.omt.learn.algo;

  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  import java.util.Arrays;

  public class CutTheSticks2 {
    public static void main(String s[]) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        short N = Short.parseShort(br.readLine());
        short[] A = new short[N];
        N = 0;
        for (String str : br.readLine().split(" ")) {
            A[N++] = Short.parseShort(str);
        }

        Arrays.sort(A);

        StringBuffer sb = new StringBuffer();
        System.out.println(N);
        for (int i = 1; i < N; i++) {
            if (A[i - 1] != A[i]) {
                sb.append((N - i) + "\n");
            }
        }

        // OUTPUT
        System.out.print(sb);
    }
  }

答案 3 :(得分:0)

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int arr[] = new int[n];
        for(int arr_i=0; arr_i < n; arr_i++){
            arr[arr_i] = in.nextInt();
        }
        int count = 2;
        int min=1000;
        for(int arr_i=0;count !=1 ; arr_i++){ // read
            count = 0;
            for(int arr_j=0; arr_j < n; arr_j++)// find min
            { if(min >arr[arr_j] && arr[arr_j]!=0)
               min=arr[arr_j];
              }

            for(int arr_k=0; arr_k < n; arr_k++)// sub
            {
                if(arr[arr_k]>=min)
                 {   count++;
                     arr[arr_k]= arr[arr_k] - min;
                 }


            }

           System.out.println(count);  
        }

    }
}

答案 4 :(得分:0)

这是一个有效的JavaScript解决方案。花了一些时间才意识到JavaScript中的sort()按字母顺序执行字符串比较。

function sortNumbers(a, b) {
    return a - b;
}

function cutSticks(arr){
    var smallestStick = 0;  
    arr = arr.sort(sortNumbers); 
    while(arr.length > 0) {
        console.log(arr.length);
        smallestStick = arr[0];

        var newArray = [];
        arr.forEach(function (val) {
            var newValue = val - smallestStick;
            if (newValue > 0) {
                newArray.push(newValue);
            }
        });

        arr = newArray;
    }
}

function main() {
    var n = parseInt(readLine());
    arr = readLine().split(' ');
    arr = arr.map(Number);
    cutSticks(arr);
}

希望它有所帮助!

答案 5 :(得分:0)

Java版本。通过了所有测试,但不确定是否是最佳性能。

HADOOP_CLASSPATH