首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >夏洛克与野兽

夏洛克与野兽
EN

Stack Overflow用户
提问于 2015-11-08 01:30:45
回答 2查看 1K关注 0票数 1

我在HackerRank上解决了以下问题。由于无法继续,我搜索了这个问题并找到了以下代码:

代码语言:javascript
复制
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部分。有人能帮我一步一步地理解它吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-08 02:40:35

要解决这个问题,我们需要找到ab,以便:

代码语言:javascript
复制
- 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

代码语言:javascript
复制
  for(int j = 0;j <= n/5;j++) // j cannot be > n/5, of course

一旦我们找到验证需求的j,我们就完成了,因为它必须是最好的(最低的j)。J提供了一个解决方案吗?好吧,让我们来看看这个:

代码语言:javascript
复制
   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的许多值,我认为它不需要解释。

票数 4
EN

Stack Overflow用户

发布于 2015-11-08 02:35:16

代码语言:javascript
复制
Scanner in = new Scanner(System.in);
int t = in.nextInt();

这里的代码非常清楚。它创建新的扫描器并读取整数输入。

代码语言:javascript
复制
while((t--)>0){
         int n = in.nextInt();
         StringBuffer answer = new StringBuffer();

在while循环中,“嘿,如果我从t中减去一个,它还会大于零吗?如果是的话,继续前进!”--意思是减去一个,类似于++的意思是加一个。int只是接受另一个扫描器输入和用于创建最终解决方案输出的StringBufferis,方法是向它添加我们想要的任何内容。如果您知道StringBuilder是什么,那么它与此类似。StringBuilder与StringBuffer的区别很好地解释了这种差异。

代码语言:javascript
复制
for(int j = 0;j <= n/5;j++){

这个for循环在条件为'j <= n/5‘的情况下运行。如果j小于或等于(<=)整数n除以5,那么它将在循环中运行代码。结尾的j++只是将整数j增加1,当循环第一次运行时,它被声明为零。这使得它不总是计算为true,并创建一个无限循环,因为这些都是坏的。

代码语言:javascript
复制
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是剩余的。

代码语言:javascript
复制
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的长度如何,它都会将其添加到字符串的末尾。

代码语言:javascript
复制
System.out.println(answer.toString());
break;

这将打印出答案StringBuilder的当前值。注意,要打印出来,必须使用.toString()方法。StringBuilder对象不是字符串,必须将其转换为字符串,然后才能作为字符串使用。打印之后,它会从它运行的最近的循环中分离出来,因此它会中断:

代码语言:javascript
复制
for(int j = 0;j <= n/5;j++){}

最后一点:

代码语言:javascript
复制
if(answer.toString().equals(""))
             System.out.println(-1);

这会将答案字符串生成器转换为字符串(如上所述),检查是否为空(由于StringBuilders默认为空,因此不会追加任何内容),并且只运行println (如果为空的话)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33589761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档