1.1 打印正反三角形
當n=3的時候,如果想要打印如下圖所示的正反三角形,應該怎麼做呢?
*******
*****
***
*
***
*****
*******
如果我們仔細觀察,這道題並不難,它有一個規則就是:
- 上半部分: 每行的小星星逐行變少,空格逐行增多
- 下班部分: 每行的小星星逐行增多,空格逐行變少
因此總體思路就是最外層循環控制行數,嵌套一個循環,控制列數
逐行增多就循環時候遞增(i++
),逐行遞減就是循環時候遞減(i--
)
這道題的難點其實是什麼時候應該有空格。
當n=3,j<(n-i=3-3)
當n=2,j<(n-i=3-2=1) j=1 <1
算法如下:
/**
* @author qing-feng.zhao
*/
public class SolutionOne {
public static void main(String[] args) {
int n=3;
print(n);
}
public static void print(int n) {
for (int i = n ; i >= 0; i--) {
for (int j = 0; j <(n - i); j++) {
System.out.print(" ");
}
for (int j = 0; j<(2 * i + 1); j++) {
System.out.print("*");
}
System.out.println();
}
for (int i = 1 ; i <=n; i++) {
for (int j = n-i; j >0; j--) {
System.out.print(" ");
}
for (int j = 0; j<(2 * i + 1); j++) {
System.out.print("*");
}
System.out.println();
}
}
}
打印效果如下所示:
*******
*****
***
*
***
*****
*******
1.2 打印相框
相框有n+2行,第1行和第n+2 行有n個*
,他們之間有n-2個空格。(3<=n<20)
例如,當n=3 時候,輸出內容如下:
****
* *
* *
* *
* *
****
這道解題思路更加簡單,首先最外層循環控制輸出多少行,其次單獨處理第一行和最後一行。
單獨處理每一行的第一列和最後一列的字符,中間的全部設置爲空格。
吶,算法解題如下:
/**
* @author qing-feng.zhao
*/
public class SolutionTwo {
public static void main(String[] args) {
Solution(4);
}
public static void Solution(int n){
if(n>=3&&n<20){
for (int i = 1; i <= (n+2); i++) {
if(i==1||i==(n+2)){
for (int j = 0; j < n; j++) {
System.out.print("*");
}
System.out.println();
}else{
for (int j = 0; j < n; j++) {
if(j==0||j==(n-1)){
System.out.print("*");
}else{
System.out.print(" ");
}
}
System.out.println();
}
}
}else{
System.err.println("輸入參數非法");
}
}
}
輸出結果如下:
****
* *
* *
* *
* *
****
1.3 打印字母
1.3.1 打印字母一
打印m行n列矩陣,要求每一行每一列的字母都按照升序排序,第一行第一列的字母爲A.
(0<=m<=10,0<=n<=16)
輸出爲m行,每行爲n個按要求順序排列的字符。
樣例輸入:
3 9
樣例輸出:
ABCDEFGHI
BCDEFGHIJ
CDEFGHIJK
算法解決如下:
/**
* @author qing-feng.zhao
*/
public class SolutionThree {
public static void main(String[] args) {
int m=3,n=9;
Solution(m,n);
}
public static void Solution(int m,int n){
char first='A';
//控制輸出多少行
for (int i = 0; i < m; i++) {
//控制每一行的每一列
for (int j = 0; j < n ; j++) {
//第一行第一列爲A
if(i==0&&j==0){
System.out.print(first);
}else{
//B =A+1
first=(char)(first+1);
System.out.print(first);
}
}
System.out.println();
first=(char)('A'+i);
}
}
}
輸出結果如下所示:
ABCDEFGHI
BCDEFGHIJ
CDEFGHIJK
1.3.2 打印字母二
這個屬於上面的題目變種,大致還是一樣.
打印m行直角三角形,要求每一行和每一列的字母都按照字典升序排列,第一行的字母爲A.第二行的字母爲BC,第三行的字母爲CDE.
樣例輸入:
5
樣例輸出:
A
BC
CDE
DEFG
EFGHI
算法解答如下:
/**
* @author qing-feng.zhao
*/
public class SolutionFour {
public static void main(String[] args) {
int m=5;
Solution(m);
}
public static void Solution(int m){
char first='A';
//控制輸出多少行
for (int i = 0; i < m; i++) {
//第一行第一列爲A
if(i==0){
System.out.print(first);
}else{
//控制多少列
for (int j = 0; j <(i+1); j++) {
//B =A+1
first=(char)(first+1);
System.out.print(first);
}
}
System.out.println();
//每一個行的第一列字符
// A = A+ 0;
// B = A+1;
// C= A+2;
first=(char)('A'+i);
}
}
}
輸出結果如下:
A
BC
CDE
DEFG
EFGHI
1.4 分數名次統計
假設有這麼一個數組,int[] nums={88,86,87,88,89,99,89};
第一個是自己的成績,請設計一個程序計算自己的名次。
測試輸入:
7
88,86,87,88,89,99,89
測試輸出:
第3名
這道題的解題思路是首先數組按照冒泡排序,排序之後成績從小到大進行排序。
然後反向遍歷成績數組,也就是成績從大到小開始檢查,自己的成績肯定在這個數組裏。
如果兩個人的分數相同,那麼名次應該相同,否則名次需要累加。
當找到等於自己成績的第一個元素的時候就將其名次輸出。
解題算法如下:
/**
* @author qing-feng.zhao
*/
public class Test {
public static void main(String[] args) {
int[] nums={88,86,87,88,89,99,89};
Solution(nums);
}
public static void Solution(int[] nums){
int currentScore=88;
for(int i=0;i<nums.length;i++) {
for(int j = 0;j<nums.length-1;j++) {
if(nums[j]>nums[j+1]) {
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
System.out.println();
for (int i = (nums.length-1),j=1; i>=0 ; i--) {
if(nums[i]!=nums[i-1]){
j++;
}
if(nums[i]==currentScore){
System.out.print("第"+(j)+"名");
break;
}
}
}
}
輸出效果如下:
第3名