Java算法篇之打印小星星和成績名次統計

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名
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章