打印正反三角形和冒泡排序算法
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名






还没有评论,来说两句吧...