题目就不给了,大家都有
一、测试点2
这个测试点我找了很久时间,也找了很多博客,都没找到,因为我以为当 n<7的时候,存在两种情况
// 第一种
*
// 第二种
***
*
这在我的理解中,才是真的符合题目的那句 “不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号” ,没想到就是这个理解,让我debug了半个小时!当发现真相的我简直哭笑不得!
当n小于7的时候只有一种情况,就是
*
对,你没看错,就是一个 “ * ”,可能这才是符合题目的沙漏形状吧,是我想多了……
所以想通过测试点2,就加个判断,当 n < 7 的时候,只会打印出一个Symbol,当然,没使用到的符号数也要打印出来
二、附上我自己的代码
比较冗余,没有去进行优化,主要是我第一遍写的时候,就只剩下测试点2没通过了,而找通过测试点2的方法又找了很久,心累 :(
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @ClassName Main_1027
* @Description TODO 打印沙漏
* @date 2021/8/28 11:15
* @Author ZY
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] messages = br.readLine().split("\\s+");
br.close();
int total = Integer.parseInt(messages[0]); // 给的符号总数
String symbol = messages[1]; // 给的符号
if (total<7){
System.out.println(symbol);
System.out.println(total-1);
return;
}
// 计算到底有几层——先不考虑只有一层的情况以及没有的情况
int lines = 1;
while (true){
int nowSymbol = 2*lines*lines + 4*lines;
if (nowSymbol > total-1){
lines--;
break;
}
if (nowSymbol == total-1){
break;
}
lines++;
}
// 这就得到了最大的层数lines
// 还要考虑以下情况
// 1.加上最中间的1是否超过总数,若超过lines-1
if (2*lines*lines + 4*lines +1 > total){
lines--;
}
int upLines = lines;
int downLines = lines;
// 2.如果剩下的还能让上面或者下面多一行,则上面的多加一行
boolean flag = false;
if (total-(2*lines*lines + 4*lines)-1 >= 2*(lines+1)+1){
flag = true;
upLines++;
}
// 打印沙漏
upShape(upLines,symbol);
if (flag){
System.out.print(" ");
}
for (int i = 0; i < lines; i++) {
System.out.print(" ");
}
System.out.println(symbol);
downShape(downLines,symbol,flag);
// 输出还剩下的
if (upLines == downLines){
System.out.println(total - (2*lines*lines + 4*lines +1));
}else{
System.out.println(total - (2*lines*lines + 4*lines +1)-(2*(lines+1)+1));
}
}
// 上半截
private static void upShape(int upLines,String symbol) {
for (int i = upLines;i>0;i--){
// 输出空格
for (int j = 0;j<upLines-i;j++){
System.out.print(" ");
}
//输出符号
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print(symbol);
}
System.out.println();
}
}
// 下半截
private static void downShape(int downLines,String symbol,boolean flag) {
if (flag){
for (int i = 1;i<=downLines;i++){
System.out.print(" ");
//输出空格
for (int j = i; j < downLines; j++) {
System.out.print(" ");
}
// 输出符号
for(int j = 0;j<(2*i+1);j++ ){
System.out.print(symbol);
}
System.out.println();
}
}else {
for (int i = 1;i<=downLines;i++){
//输出空格
for (int j = i; j < downLines; j++) {
System.out.print(" ");
}
// 输出符号
for(int j = 0;j<(2*i+1);j++ ){
System.out.print(symbol);
}
System.out.println();
}
}
}
}