夏洛克和野兽问题



问题:福尔摩斯对他的死敌莫里亚蒂教授越来越偏执。他制服莫里亚蒂的所有努力都是徒劳的。这些天夏洛克正在和华生医生一起解决一个问题。Watson提到,美国中央情报局的超级计算机"野兽"最近一直面临着奇怪的问题。

今天下午,夏洛克收到莫里亚蒂的一封信,说他用病毒感染了"野兽"。此外,纸条上还印着数字N。经过计算,夏洛克发现,清除病毒的钥匙是最大的N位数的体面数字。

体面号码具有以下属性:

  • 3、5或两者都作为其数字。不允许使用其他数字
  • 3出现的次数可以被5整除
  • 5出现的次数可以被3整除

与此同时,对抗"野兽"毁灭的反击正在迅速进行。你能拯救"野兽",在夏洛克之前找到钥匙吗?

我正在努力解决"神探夏洛克和野兽"的问题(如上)在hackerbank和这里是我结束什么-

import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    int n = s.nextInt();
    for(int i=0;i<n;i++) {
        int subject = s.nextInt();
        if(isPerfectlyDivisible(subject, 3)) {
            System.out.println(stringBuilder("5", subject));
            continue;
        }
        if (isPerfectlyDivisible(subject, 5)) {
            System.out.println(stringBuilder("3", subject));
            continue;
        }
        if(!isPerfectlyDivisible(subject, 5) && !(isPerfectlyDivisible(subject, 3))) {
            List<Integer> multipliers = dividedMultipliers(subject);
            if (multipliers.isEmpty()) {
                System.out.println("-1");
            } else {
                System.out.println(stringBuilder("5", multipliers.get(0))+stringBuilder("3", multipliers.get(1)));
            }
        }
    }
}
private static boolean isPerfectlyDivisible(int n, int divider) {
    if (n < divider) return false;
    if (n%divider == 0) return true;
    return false;
}
private static List<Integer> dividedMultipliers(int n) {
    List<Integer> multipliers = new ArrayList<Integer>();
    for(int i=n;i>0;i--) {  
      if( (i%3 == 0) && ((n-i)%5 == 0)) {
          multipliers.add(i);
          multipliers.add(n-i);
          break;
      }    
    }
    return multipliers;
}
private static String stringBuilder(String s, int times) {
    StringBuffer buffer = new StringBuffer();
    for(int i=0;i<times;i++) {
        buffer.append(s);
    }
    return buffer.toString();
}
}

有测试用例对此失败。我试着查看一个失败的测试用例,它的输入是

5
2194
12002
21965
55140
57634

令人惊讶的是,对于21965,输出都是5,而我上面的代码返回的都是3。。这似乎是预期的输出。。不确定问题出在哪里?任何见解都将有助于

您正在寻找最大的合适数字,因此您应该最大限度地增加5s的数量。例如,21965可以被5整除,但最大的21965位数字并不是只由3组成的数字;它有21960个5秒和5个3秒。

你的dividedMultipliers程序已经运行了最多5秒,但将一个可被5整除的数字视为特殊数字会破坏这种逻辑;它将创建最不优化的体面数字。

去掉那个特例。(您也可以去掉另一种特殊情况,它检查一个只有5s的数字,因为dividedMultipliers在第一次迭代中会立即处理这种情况。)

这是您的问题的解决方案;)

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();
        findSolution(n);
    }
}
public static void findSolution(int n){
    int a = n/3;
    int temp = n;
    int  i;
    boolean flag = false;
    for(i=a;i>=0;i--){
        temp = n-3*i;
        if(temp%5 == 0){
            flag = true;
            break;
        }
    }
    if(flag){
        for(int j=1;j<=n;j++){
            if(j<=i*3)
                System.out.print("5");
            else
                System.out.print("3");    
        }                
        System.out.println();
    }
    else
        System.out.println("-1");
}
}

最新更新