2016-03-27 74 views
0

我已经写在JavaScript此代码为this hackerrank挑战:夏洛特和兽 - Hackerrank

function main() { 
    var t = parseInt(readLine()); 
    for(var a0 = 0; a0 < t; a0++){ 
     var n = parseInt(readLine()); 
     if(n < 3) { 
      process.stdout.write("-1\n"); 
     } else if(n % 5 == 0 && n % 3 != 0) { 
      for(var i = 0; i < n; i++) { 
       process.stdout.write("3"); 
      } 
      process.stdout.write("\n"); 
     } else if(n % 3 == 0 && n % 5 != 0) { 
      for(var i = 0; i < n; i++) { 
       process.stdout.write("5"); 
      } 
      process.stdout.write("\n"); 
     } else if(n % 5 != 0 && n % 3 != 0) { 
      var nts = 5; 
      n -= 5; 
      while(n % 3 != 0) { 
       n -= 5; 
       nts += 5; 
      } 
      for(var i = 0; i < n; i++) { 
       process.stdout.write("5"); 
      } 
      for(var i = 0; i < nts; i++) { 
       process.stdout.write("3"); 
      } 
      process.stdout.write("\n"); 
     } else if(n % 15 == 0) { 
      for(var i = 0; i < n; i++) { 
       process.stdout.write("5"); 
      } 
      process.stdout.write("\n"); 
     } 

    } 
} 

它通过测试用例0,1,2,4,5和10而不是其他。我究竟做错了什么?不要告诉正确的解决方案。只是一个暗示将工作,我认为。 :P

+0

您正在考虑它在一个非常复杂的方式。很难说什么暗示会有所帮助,除了再次从头开始思考并找到一般情况。这很简单。 –

+1

我如何知道以另一种方式思考? ._。 –

+0

你的方法很好。用_N_ = 6单步执行代码,您很快就会发现该错误。 –

回答

1

下面是一些提示,如果你不想要一个可行的解决方案,不看下面:)

1的代码,如果N小于3不能有一个体面的数量
2.越多的数字越大,因为我们想要最大的数字,我们将检查看看有多少个5我们可以适应它,然后再看3的数字
3.如果N是3的倍数,则最大数字可能会全部为5的
4.如果N不是3的倍数,看看有多少5可以容纳并为一些3的空间留下足够的空间
例如, N = 19 ...记住3的数量只能是5的倍数(0或5或10或15 ...等等)

第一次尝试 - 会说18 5和1 3('s) - 这是无效的

因此,通过3减少5点的数量,然后再试一次
第二个尝试 - 15 5的和4 3的 - 无效仍

3因此减少5点的数量,然后再试一次
第三次尝试 - 12 5和7 3 - 无效仍然

因此减少5的数量减少3,然后再试一次
第4次尝试 - 9 5和10 3 - 有效!


希望它可以帮助有些

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 t = in.nextInt(); 
     for(int a0 = 0; a0 < t; a0++){ 
      int n = in.nextInt(); 
      if(n<3){ 
       printNumber(0,0); 
      } 
      else if(n%3==0){ 
       printNumber(n,0);     
      } 
      else { 
       int rem = n%3; 
       int k = 5; 
       boolean divides = false; 
       while(k<=n){ 
        divides = (k-rem)%3==0; 
        if(divides){ 
         break; 
        } 
        k+=5; 
       } 
       if(divides){ 
        printNumber(n-k,k); 
       } else{ 
        printNumber(0,0); 
       } 
      }    
     } 
    } 

    private static void printNumber(int fives, int threes) { 
     if(fives== 0 && threes==0) { 
      System.out.println("-1"); 
      return;     
     } 
     StringBuilder sb = new StringBuilder(); 
     while(fives>0){ 
      sb.append("5");fives--; 
     } 
     while(threes>0){ 
      sb.append("3");threes--; 
     } 
     System.out.println(sb.toString()); 
    } 
} 
+0

你能看到我的代码中的问题? :D –

+1

例如,看看你的第一个条件 - 你检查n是5的倍数,但不是3的倍数,然后你打印所有的3 ...所以n是20 ...你的答案是3重复20次。 ..而最大的数字将有5个重复15次,然后是3个重复5次.....所以基本上你需要检查你的逻辑......我已经提到了我在我的帖子中使用的逻辑 – abhaybhatia