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

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

输入

第一行包含一个整数T(测试用例的数量)。 T个后续行的每一行i包含一个String,S。

产量

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

样本输入

2

黑客

样本输出

Hce akr

Rn ak

我写的守则

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 akr

Rn ak

问题

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

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

谁能告诉我我在哪里弄错了?

进一步修改

然后,我决定将最后3行print语句更改为一个语句,如下所示:

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

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

[C @ 5c3f3b9b [C @ 3b626c6d

[C @ 3abc8690 [C @ 2f267610

我怀疑

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

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

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

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

试着提交:

 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); } 

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

我可以解决你的第二个问题:—> System.out.print(strE); – >在底部,调用该方法(public void print(char s []));

– > System.out.println(strE +“”+ strO); – >在底部,调用该方法(public void println(String x))

对于你的第一个答案,我无法回答你,因为我不知道编译器是如何工作的,但我可以回答你的第二个问题。

System.out.print(strE); System.out.print(" "); System.out.println(strO);之所以System.out.print(strE); System.out.print(" "); System.out.println(strO); System.out.print(strE); System.out.print(" "); System.out.println(strO); work是因为System.out.print(char[])System.out.println(char[])在打印之前自动将char数组转换为可读字符串。

但是,在第二种情况下System.out.println(strE + " " + strO); ,你正在做的是直接将char数组转换为字符串,它只打印数组对象的类和哈希代码,因为toString()方法在数组类中没有被覆盖。 你想要做的是System.out.println(new String(strE) + " " + new String(strO)); 。 它会给你你想要的结果。

  Scanner scanner = new Scanner(System.in); System.out.println("Enter the no.of test-cases:"); int t = scanner.nextInt(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter the String(s)"); for (int i = 0; i < t; i++) { String myString = br.readLine(); 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); System.out.println(odd); } scanner.close(); 
 int T = scan.nextInt(); 

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

 String string[] = new String[T]; for(int i = 0; i 

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

 for(int temp = 0; temp 

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

 for(int j = 0; 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 

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