我在HackerRank上解决了以下问题。由于无法继续,我搜索了这个问题并找到了以下代码:
public class Solution {
public static void main(String[] args) {
/* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
Scanner in = new Scanner(System.in);
int t = in.nextInt();
while((t--)>0){
int n = in.nextInt();
StringBuffer answer = new StringBuffer();
for(int j = 0;j <= n/5;j++){
//System.out.println("J="+j+" N/5="+(n/5));
//System.out.println("(n-5*j) = "+(n-5*j));
if((n-5*j)%3 == 0){
for(int k = 0;k< n-5*j;k++)
answer.append("5");
for(int k = 0;k < 5*j;k++)
answer.append("3");
System.out.println(answer.toString());
break;
}
}
if(answer.toString().equals(""))
System.out.println(-1);
}
}
}我很难理解这段代码是如何工作的,特别是(n-5*j)%3部分。有人能帮我一步一步地理解它吗?谢谢。
发布于 2015-11-08 02:40:35
要解决这个问题,我们需要找到a和b,以便:
- a + b = n
- a is divisible by 5 (a = 5*j where j is some integer)
- b is divisible by 3, (b = n-a = n-5*j is divisible by 3, written as (n-5*j)%3 == 0答案是:(b times)5 followed by (a times)3
我们需要的是找到j,比如n = 5*j + 3*something。
如果我们找不到任何这样的j,问题就没有解决办法。
如果有很多解决方案,那么最好的解决方案就是给出最高的b,因为左边有更多的5。但是,highest b意味着最低的j。因此,我们开始从0向上检查j,
for(int j = 0;j <= n/5;j++) // j cannot be > n/5, of course一旦我们找到验证需求的j,我们就完成了,因为它必须是最好的(最低的j)。J提供了一个解决方案吗?好吧,让我们来看看这个:
if((n-5*j)%3 == 0) // if so, then j is a solution: b=n-5*j and a=5*j
for(int k = 0;k< n-5*j;k++)
answer.append("5"); // print 5 b times
for(int k = 0;k < 5*j;k++)
answer.append("3"); // print 3 a times其余的代码用于解析输入和求解n的许多值,我认为它不需要解释。
发布于 2015-11-08 02:35:16
Scanner in = new Scanner(System.in);
int t = in.nextInt();这里的代码非常清楚。它创建新的扫描器并读取整数输入。
while((t--)>0){
int n = in.nextInt();
StringBuffer answer = new StringBuffer();在while循环中,“嘿,如果我从t中减去一个,它还会大于零吗?如果是的话,继续前进!”--意思是减去一个,类似于++的意思是加一个。int只是接受另一个扫描器输入和用于创建最终解决方案输出的StringBufferis,方法是向它添加我们想要的任何内容。如果您知道StringBuilder是什么,那么它与此类似。StringBuilder与StringBuffer的区别很好地解释了这种差异。
for(int j = 0;j <= n/5;j++){这个for循环在条件为'j <= n/5‘的情况下运行。如果j小于或等于(<=)整数n除以5,那么它将在循环中运行代码。结尾的j++只是将整数j增加1,当循环第一次运行时,它被声明为零。这使得它不总是计算为true,并创建一个无限循环,因为这些都是坏的。
if((n-5*j)%3 == 0){此if语句执行操作'(n-5*j)%3‘,然后比较结果是否等于零,如果为零,则运行代码。由于操作的顺序,括号中的表达式将首先计算。'n-5*j‘也遵循运算的顺序,所以它不评估人们最初的想法。它将整数j乘以5,然后从n中减去乘积。结尾的%表示将第一个数除以下面的数,然后返回余数。因此,3%3将返回0,因为3被均分为3.62%3将返回2,因为3等于60,最后2是剩余的。
for(int k = 0;k< n-5*j;k++)
answer.append("5");
for(int k = 0;k < 5*j;k++)
answer.append("3");这两个for循环非常相似,所以我将解释第一个循环,您应该能够解释另一个循环。类似于其他for循环(至少增强的for循环不同),for循环定义变量k并在开始时将其设置为零。它不会在每次迭代时创建k变量。
而且,您可能会说,“在同一个类中怎么能有两个k变量呢?”这是因为k变量是在一个封闭作用域中定义的,这意味着只有循环中的代码才能访问k变量。因此,在循环之外,如果需要,可以再次声明(作者已经声明了)。
表达式'k< n-5*j‘几乎与我前面解释的表达式相同,只是没有%。如果满足条件,则在评估和运行之后,将k增加一次,并在循环中运行代码,然后重新计算。
'answer.append("5");‘5’在回答StringBuffer后附加‘5’。它不将其作为和整数追加,而是以字符串/字符的形式追加。不管StringBuffer的长度如何,它都会将其添加到字符串的末尾。
System.out.println(answer.toString());
break;这将打印出答案StringBuilder的当前值。注意,要打印出来,必须使用.toString()方法。StringBuilder对象不是字符串,必须将其转换为字符串,然后才能作为字符串使用。打印之后,它会从它运行的最近的循环中分离出来,因此它会中断:
for(int j = 0;j <= n/5;j++){}最后一点:
if(answer.toString().equals(""))
System.out.println(-1);这会将答案字符串生成器转换为字符串(如上所述),检查是否为空(由于StringBuilders默认为空,因此不会追加任何内容),并且只运行println (如果为空的话)。
https://stackoverflow.com/questions/33589761
复制相似问题