javascript - 夏洛克与野兽 - Hackerrank

标签 javascript node.js algorithm greedy

我已经用 javascript 为 this 编写了这段代码黑客等级挑战:

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

最佳答案

这里有一些提示,如果你不想要一个可行的解决方案,请不要看下面的代码:)

1.如果N小于3,就没有像样的数
2. 5越多数字越大,因为我们想要尽可能大的数字,所以在看3之前我们先看看能放多少个5
3. 如果 N 是 3 的倍数,那么最大可能的数就是全 5
4.如果N不是3的倍数,看能放多少个5,留出足够的空间给一些3
例如。 N = 19 ... 记住 3 的个数只能是 5 的倍数(0 或 5 或 10 或 15 ... 等等)

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

因此,将 5 的数量减少 3,然后重试
第二次尝试 - 15 个 5 和 4 个 3 - 仍然无效

因此,将 5 的数量减少 3,然后重试
第三次尝试 - 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());
    }
}

关于javascript - 夏洛克与野兽 - Hackerrank,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36249453/

相关文章:

javascript - 插入 4 个空格而不是制表符

node.js - 在 express.js 中,req.protocol 没有为我的安全链接选择 "https"。它总是选择 "http"

node.js - NodeJs GraphQL 枚举类型值作为动态

c++ - 将伪代码翻译成 C++

c++ - O(log N) 查找和更新的数据结构,考虑到小型 L1 缓存

javascript - "convert foo to bar"的函数名称约定

javascript - 我如何知道 V8 中有哪些功能?

javascript - Angular 中 *ngFor 的减量索引

javascript - 在 Node.JS/express 全局访问 Firebase

algorithm - 构建算法/公式