打印正反三角形和冒泡排序算法
1.1 打印正反三角形1.2 打印相框1.3 打印字母1.3.1 打印字母一1.3.2 打印字母二1.4 分数名次统计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
样例输出:
ABCDEFGHIBCDEFGHIJCDEFGHIJK
算法解决如下:
/*** @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++) {//第一行第一列为Aif(i==0&&j==0){System.out.print(first);}else{//B =A+1first=(char)(first+1);System.out.print(first);}}System.out.println();first=(char)('A'+i);}}}
输出结果如下所示:
ABCDEFGHIBCDEFGHIJCDEFGHIJK
1.3.2 打印字母二
这个属于上面的题目变种,大致还是一样.
打印m行直角三角形,要求每一行和每一列的字母都按照字典升序排列,第一行的字母为A.第二行的字母为BC,第三行的字母为CDE.
样例输入:
5
样例输出:
ABCCDEDEFGEFGHI
算法解答如下:
/*** @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++) {//第一行第一列为Aif(i==0){System.out.print(first);}else{//控制多少列for (int j = 0; j <(i+1); j++) {//B =A+1first=(char)(first+1);System.out.print(first);}}System.out.println();//每一个行的第一列字符// A = A+ 0;// B = A+1;// C= A+2;first=(char)('A'+i);}}}
输出结果如下:
ABCCDEDEFGEFGHI
1.4 分数名次统计
假设有这么一个数组,int[] nums={88,86,87,88,89,99,89};
第一个是自己的成绩,请设计一个程序计算自己的名次。
测试输入:
788,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名
如果觉得《Java算法篇之打印小星星和成绩名次统计》对你有帮助,请点赞、收藏,并留下你的观点哦!