如何在 Java 中打印字符串数组的偶数和奇数位置字符?

新手上路,请多包涵

问题

给定一个长度为 N 的字符串 S,索引从 0 到 N-1,将它的偶数索引字符和奇数索引字符作为 2 个空格分隔的字符串打印在一行上。假设输入从索引位置 0 开始(这被认为是偶数)

输入

第一行包含一个整数 T(测试用例数)。 T 个后续行中的每一行 i 都包含一个字符串 S。

输出

对于每个字符串 S,打印它的偶数索引字符,后跟空格,然后是奇数索引字符。

样本输入

2个

黑客

示例输出

Hce阿克尔

Rnak

我写的代码

public static void main(String[] args)
{
    Scanner scan    =   new Scanner(System.in);
    int T   =   scan.nextInt();
    scan.nextLine();

    for(int i=0 ; i<T ; i++)
    {
        String  myString    =   scan.nextLine();

        int evn =   0,
            odd =   0,
            len =   myString.length();

        char    strE[]  =   new char[50],
                strO[]  =   new char[50];

        for(int j=0 ; j<len ; j++)
        {
            if(j%2 == 0)
            {
                strE[evn]   =   myString.charAt(j);
                evn++;
            }
            if(j%2 == 1)
            {
                strO[odd]   =   myString.charAt(j);
                odd++;
            }
        }
        System.out.print(strE);
        System.out.print(" ");
        System.out.println(strO);
    }
}

我的输出

Hce阿克尔

Rnak

问题

如您所见,我的程序成功满足测试用例和其他测试用例(使用自定义输入),但每次 HackerRank 编译器都告诉我我的程序不满足测试用例。

显然,我的程序正在生成所需的输出,但每次 HackerRank 编译器都告诉我我的解决方案有误。

谁能告诉我哪里出错了?

进一步修改

然后我决定将打印语句的最后 3 行更改为一条语句,如下所示:

 System.out.println(strE + " " + strO);

然而,这次程序 没有 产生所需的输出,而是打印了一些垃圾值,如下所示:

[C@5c3f3b9b [C@3b626c6d

[C@3abc8690 [C@2f267610

我的疑惑

1. 在第一种情况下,当我使用 2 个打印语句分别打印两个字符串时,我每次都得到正确的输出,但 HackerRank 编译器拒绝了它。 为什么?

2. 在第二种情况下,当我通过使用一条打印语句而不是 3 条打印语句来修改程序以获得所需的结果时,程序给出了完全不同的输出,而是打印了垃圾值! 为什么?

以下是 HackerRank 问题的链接以获取更多信息: hackerrank.com/challenges/30-review-loop

非常感谢所有帮助和指导,并提前致谢!

原文由 enigma6174 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 885
2 个回答
int T = scan.nextInt();

这会读取我们将要处理的测试用例的数量。

 String string[] = new String[T];
for(int i = 0; i<T; i++){
  string[i] = scan.next();

接下来我们创建一个名为“string”的数组(顺便说一句,这对于变量/对象来说是一个糟糕的名称),它的大小为 T 并且在 for 循环中从输入 T 次读取测试用例并将它们保存在数组中。

 for(int temp = 0; temp<T; temp++){

现在,对于每个测试用例,我们执行以下操作……

 for(int j = 0; j<string[temp].length(); j = j+2)
{
    System.out.print(string[temp].charAt(j));
}

我们创建了一个局部变量 j,它只在这个 for 循环中可见。 j 保存我们正在处理的字符串 (=string[temp]) 的索引。因此,我们在位置 j 上打印一个字符(通过使用 String 类的标准方法“charAt”,它返回给定字符串索引的字符)然后将其增加 2。因此,此代码将打印每个偶数字符。对于字符串“example”,它将打印“eape”(j=0、j=2、j=4、j=6)。

 System.out.print(" ");

用空格分隔序列。

 for(int j = 1; j<string[temp].length(); j = j+2){
    System.out.print(string[temp].charAt(j));
}

System.out.println();

我们正在做同样的事情(创建索引 j,遍历字符串的所有字符),但是从“1”开始,所以它将打印字符串的所有奇数字符。对于字符串“example”,它将为您提供“xml”(j=1、j=3、j=5)。在此之后,它将结束字符串。我希望,它会帮助你理解。 :)

原文由 user3133925 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试提交这个:

 Scanner scan = new Scanner(System.in);
int T = scan.nextInt();
scan.nextLine();
for (int i = 0; i < T; i++) {
    String myString = scan.nextLine();
    String even = "";
    String odd = "";
    for (int j = 0; j < myString.length(); j++) {
        if (j % 2 == 0) {
            even += myString.charAt(j);
        } else {
            odd += myString.charAt(j);
        }
    }

    System.out.println(even + " " + odd);
}

我得到了正确的输出,它应该满足所有要求。我认为你的代码失败了,因为它不是你最后打印的真正的字符串,而且你的数组中有空点

原文由 XtremeBaumer 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题