问题:福尔摩斯对他的死敌莫里亚蒂教授越来越偏执。他制服莫里亚蒂的所有努力都是徒劳的。这些天夏洛克正在和华生医生一起解决一个问题。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");
}
}