我只是想不出怎么得到我想要的结果。这是我的密码
import java.util.Scanner;
public class StringInABox
{
public static void main(String[]args)
{
Scanner scan = new Scanner(System.in);
System.out.println("Enter a phrase or word!");
String Phrase = scan.nextLine();
String CapPhrase = Phrase.toUpperCase();
int PhraseLength = CapPhrase.length();
String SidePhrase = CapPhrase.substring(1);
int SidePhraseL = SidePhrase.length()-1;
for (int Letter = 0; Letter<PhraseLength; Letter++)
System.out.print(CapPhrase.charAt(Letter)+" ");
System.out.println();
for (int Letter = 0; Letter<SidePhraseL; Letter++)
System.out.println(SidePhrase.charAt(Letter));
for (int Letters = SidePhraseL-1; Letters>=0; Letters--)
{ for (int Space=0; Space <= PhraseLength*2-3;Space++)
System.out.print(" ");
System.out.println(SidePhrase.charAt(Letters));}
for (int Letter = PhraseLength-1; Letter>=0; Letter--)
System.out.print(CapPhrase.charAt(Letter)+" ");
}
} 其结果应该是:
H E L P
E L
L E
P L E H但我只能得到:
H E L P
E
L
L
E
P L E H我的想法已经用完了。我是一个初学者,这不应该采取先进的编码。
发布于 2018-03-19 05:05:04
您非常接近,但这里的问题是for循环的顺序。要获得所需的输出,如下所示:
E L
L E您需要在相同的循环中打印这两个字符,即当它在同一行上打印时。因此,您需要IndexFromFront和IndexFromBack变量,它们分别存储E和L的值。
在初始循环之后打印字符H E L P
for (int Letter = 0; Letter < PhraseLength; Letter++)
System.out.print(CapPhrase.charAt(Letter) + " ");
System.out.println();您需要从first索引(即1 )开始访问E,IndexFromBack的值将是PhraseLength-1-(IndexFromFront)。既然您有了必须从原始字符串中打印的值的索引,就需要得到正确的间距,即2*(PhraseLength-1)-1,因为在每个字符后面都有一个空格。所以你的第二个循环来打印线条
E L
L E应如下:
for (int Letter = 1; Letter < PhraseLength-1; Letter++) {
int IndexFromFront = Letter;
int IndexFromBack = PhraseLength-1-Letter;
// Print character from the start of string at given Index
System.out.print(CapPhrase.charAt(IndexFromFront));
// Print required spaces
for (int Space = 0; Space < 2*(PhraseLength-1)-1; Space++) {
System.out.print(" ");
}
// End space print
// Print character from the end of string matching the required index
System.out.print(CapPhrase.charAt(IndexFromBack));
// Printing on this line is complete, so print a new line.
System.out.println();
}最后一行,即给定输入字符串的反向,可以使用循环打印如下:
for (int Letter = PhraseLength - 1; Letter >= 0; Letter--)
System.out.print(CapPhrase.charAt(Letter) + " ");
}因此,最后的代码如下:
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
public class StringInABox {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Enter a phrase or word!");
String Phrase = scan.nextLine();
String CapPhrase = Phrase.toUpperCase();
int PhraseLength = CapPhrase.length();
for (int Letter = 0; Letter < PhraseLength; Letter++)
System.out.print(CapPhrase.charAt(Letter) + " ");
System.out.println();
for (int Letter = 1; Letter < PhraseLength - 1; Letter++) {
int IndexFromFront = Letter;
int IndexFromBack = PhraseLength - 1 - Letter;
System.out.print(CapPhrase.charAt(IndexFromFront));
// Print required spaces
for (int Space = 0; Space < 2 * (PhraseLength - 1) - 1; Space++) {
System.out.print(" ");
}
// End space print
System.out.print(CapPhrase.charAt(IndexFromBack));
System.out.println();
}
for (int Letter = PhraseLength - 1; Letter >= 0; Letter--)
System.out.print(CapPhrase.charAt(Letter) + " ");
}
}下面是HELPINGYOUOUT的示例输出
Enter a phrase or word!
H E L P I N G Y O U O U T
E U
L O
P U
I O
N Y
G G
Y N
O I
U P
O L
U E
T U O U O Y G N I P L E H 编辑:更易读的代码
/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
public class StringInABox {
public static void printSpaces(int phraseLength) {
for (int space = 0; space < 2 * (phraseLength - 1) - 1; space++) {
System.out.print(" ");
}
}
public static void printTopRow(String capPhrase, int phraseLength) {
for (int letter = 0; letter < phraseLength; letter++)
System.out.print(capPhrase.charAt(letter) + " ");
System.out.println();
}
public static void printIntermediateBoxRows(String capPhrase, int phraseLength) {
for (int letter = 1; letter < phraseLength - 1; letter++) {
int indexFromFront = letter;
int indexFromBack = phraseLength - 1 - letter;
System.out.print(capPhrase.charAt(indexFromFront));
// Print required spaces
printSpaces(phraseLength);
// End space print
System.out.print(capPhrase.charAt(indexFromBack));
System.out.println();
}
}
public static void printLastRow(String capPhrase, int phraseLength) {
for (int letter = phraseLength - 1; letter >= 0; letter--)
System.out.print(capPhrase.charAt(letter) + " ");
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("Enter a phrase or word!");
String phrase = scan.nextLine();
String capPhrase = phrase.toUpperCase();
int phraseLength = capPhrase.length();
// Print the box
printTopRow(capPhrase, phraseLength);
printIntermediateBoxRows(capPhrase, phraseLength);
printLastRow(capPhrase, phraseLength);
}
}发布于 2018-03-19 07:02:35
解决棘手问题的一个非常有用的策略是映射/绘制/记录所有正在变化的内容,并搜索模式。所以我们就从做这个开始。为了简单地跟踪值,我将在数组中显示这个过程。
String keyword = "test"结果会是这样的。
[t][e][s][t]
[e][ ][ ][s]
[s][ ][ ][e]
[t][s][e][t]第一行等于字符串,但我们将用与字符串中的字符索引相对应的值替换字母。Space将等于0。
[1][2][3][1]
[2][0][0][3]
[3][0][0][2]
[1][3][2][1]如果我们接受这些值,并将它们放在一行中,我们最终将得到
1231200330021321
1231 2003 3002 1321 //Easier to read version第一和最后一行被反转,第二和第三行被反转。因此,我们可以用三个索引计数器产生输出。每个索引计数器都引用原始字符串中的一个字符。
第一个索引计数器将用于向前和向后读取整个字符串。
[t][e][s][t] //From 0 -> (keyword.length-1)
[ ][ ][ ][ ]
[ ][ ][ ][ ]
[t][s][e][t] //From (keyword.length-1) -> 0第二个计数器将用于在左侧进行索引,第三个计数器将用于在右侧进行索引。
[ ][ ][ ][ ] //Be aware of possible out of bounds index errors
[e][ ][ ][s] //From 1 -> (keyword.length-2)
[s][ ][ ][e] //From (keyword.length-2) -> 1
[ ][ ][ ][ ]发布于 2018-03-19 07:21:20
这是我的答案。我根据java命名标准重新命名了事物,解决了内存泄漏(Scanner未关闭),使用了方法,并解决了这样一个事实,即单词短语意味着单词之间可能有空格。
public static void main(String[] args) {
try (Scanner scan = new Scanner(System.in)) {
System.out.println("Enter a phrase or word!");
String phrase = scan.nextLine();
phrase = phrase.toUpperCase();
phrase = cleanUpWordBoundaries(phrase);
for (int letter = 0; letter < phrase.length(); letter++) {
System.out.print(phrase.charAt(letter) + " ");
}
System.out.println();
printSidePhrase(phrase);
for (int letter = phrase.length() - 1; letter >= 0; letter--) {
System.out.print(phrase.charAt(letter) + " ");
}
}
}
private static void printSidePhrase(String phrase) {
int startIndex = 1;
int lastIndex = phrase.length() - 2;
for (int letter = 1; letter < phrase.length() - 1; letter++) {
System.out.print(phrase.charAt(startIndex));
// print spaces
for (int i = 0; i < (phrase.length() - 2); i++) {
System.out.print(" ");
}
System.out.print(" " + phrase.charAt(lastIndex));
System.out.println();
startIndex++;
lastIndex--;
}
}
private static String cleanUpWordBoundaries(String phrase) {
String[] theWords = phrase.split("\\b");
String newPhrase = new String();
for (int i = 0; i < theWords.length; i++) {
newPhrase += theWords[i];
i++;
}
return newPhrase;
}在运行程序时:
Enter a phrase or word!
w00 h00 bandit
W 0 0 H 0 0 B A N D I T
0 I
0 D
H N
0 A
0 B
B 0
A 0
N H
D 0
I 0
T I D N A B 0 0 H 0 0 W https://stackoverflow.com/questions/49355907
复制相似问题