java常见经典算法题

笔者整理出了经典的java算法题目,并且每一个手敲出来了正常运行出结果,希望对大家有帮助,后续本篇博客会继续补充和完善经典算法题,持续更新!

1:冒泡排序

package org.sang.org.sang.算法;


import java.util.Arrays;
import java.util.Collections;

/**
 * create by 86159 on 2021/1/12
 */
public class 冒泡排序 {
    
    
    public static void main(String[] args) {
    
    
        // 冒泡排序是对数组操作,如果是集合,先用list.toArray()转化为数组
        Integer[] arrays = {
    
    20, 58, 12, -12, -39, 108, 691, 2};
        // 排序方式一:
        Arrays.sort(arrays);//升序
        System.out.println("升序排列:");
        for (int num : arrays) {
    
    
            System.out.print(num + ",");
        }

        Arrays.sort(arrays, Collections.reverseOrder());//倒序
        System.out.println("--------------");
        System.out.println("倒叙排列:");
        for (int num : arrays) {
    
    
            System.out.print(num + ",");
        }

        // 以上为sort()方法自带的排序方法,但往往面试时需要手写冒泡排序排序,考验基本功
        
        
        
        //排序方式二:冒泡排序(务必要会手写)
        for (int i = 0; i < arrays.length - 1; i++) {
    
    
            for (int j = 0; j < arrays.length - 1 - j; j++) {
    
    
                if (arrays[j] < arrays[j + 1]) {
    
    
                    int temp = arrays[j];
                    arrays[j] = arrays[j + 1];
                    arrays[j + 1] = temp;
                }
            }
        }
        //打印结果
        System.out.println("--------------");
        System.out.println("冒泡倒序排序结果:");
        for (int num : arrays) {
    
    
            System.out.print(num + ",");
        }

    }
}

运行结果如下:

升序排列:
-39,-12,2,12,20,58,108,691,--------------
倒叙排列:
691,108,58,20,12,2,-12,-39,--------------
冒泡倒序排序结果:
691,108,58,20,12,2,-12,-39,

2:九九乘法表

package org.sang.org.sang.算法;

/**
 * create by chuxia0811 on 2021/1/16
 */
public class 九九乘法表 {
    
    
    public static void main(String[] args) {
    
    
        for (int i = 1;i<=9;i++){
    
    
            for (int j =1;j<=i;j++ ){
    
    
                System.out.print(j+"*"+i+"="+i*j+"  ");
            }
            System.out.println();
        }
    }
}

运行结果如下:

1*1=1  
1*2=2  2*2=4  
1*3=3  2*3=6  3*3=9  
1*4=4  2*4=8  3*4=12  4*4=16  
1*5=5  2*5=10  3*5=15  4*5=20  5*5=25  
1*6=6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36  
1*7=7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49  
1*8=8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64  
1*9=9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81  

3:最大公约数和最小公倍数

package org.sang.org.sang.算法;

/**
 * create by chuxia0811 on 2021/1/16
 */
public class 最大公约数和最小公倍数 {
    
    
    public static void main(String[] args) {
    
    
        //最小公倍数等于最大公约数乘以两者中较大的数
        int a = 16;
        int b = 20;
        System.out.println("最大公约数:" + f(a, b));
        System.out.println("最大公约数:" + (a < b ? f(a, b) * b : f(a, b) * a));
    }

    public static int f(int a, int b) {
    
    
        if (a < b) {
    
    
            int temp = a;
            a = b;
            b = temp;
        }
        if (a % b == 0) {
    
    
            return b;
        }
        return f(a, a % b);
    }
}

运行结果如下:


最大公约数:4
最大公约数:80

4:水仙花数

package org.sang.org.sang.算法;

/**
 * create by chuxia0811 on 2021/1/16
 */
public class 水仙花数 {
    
    
    public static void main(String[] args) {
    
    
        /** 什么是水仙花数?比如一个三位数,它的个位的立方加上十位的立方再加上百位的立方等于这个数本身的话,此数叫作水仙花数.
         如:某三位数abc,如果满足a^3+b^3+c^3=abc,则abc是水仙花数。
         */

        for (int i = 100; i < 999; i++) {
    
    
            int a = i % 100 % 10;  //获取个位数
            int b = i / 10 % 10;  //获取十位数
            int c = i / 100;      //获取百位数
            if (i == a * a * a + b * b * b + c * c * c) {
    
    
                System.out.println("水仙花数" + i);
            }
        }
    }
}
水仙花数153
水仙花数370
水仙花数371
水仙花数407

5:求中位数

package org.sang.org.sang.算法;

import java.util.Arrays;

/**
 * create by chuxia0811 on 2021/1/16
 */
public class 中位数 {
    
    
    // 中位数:是指一组数据从小到大排列,位于中间的那个数。可以是一个(数据为奇数),也可以是2个的平均(数据为偶数)


    public static void main(String[] args) {
    
    
        int mediu1 = 0;
        //1.数组为奇数个数,则先按正序排序,再取最中间的值
        int[] a = {
    
    9, 5, 8, 2, 10}; //
        Arrays.sort(a);
        if (a.length % 2 == 1) {
    
    
            //注意数组小标从0开始,5个数应该取a[2]
            mediu1 = a[(a.length) / 2];
        }
        System.out.println("奇数位中位数为:" + mediu1);


        //2.数组为偶数个数,中位数按正序排列,取中间两个数的平均值
        int[] b = {
    
    9, 5, 8, 2, 10, 12};
        Double mediu2 = null;
        Arrays.sort(b);
        if (b.length%2==0){
    
    
            mediu2 = Double.parseDouble(b[(b.length)/2-1]+b[(b.length)/2]+"")/2;
        }
        System.out.println("偶数位中位数为:"+mediu2);
    }
}

运行结果如下:


奇数位中位数为:8
偶数位中位数为:8.5

6:求素数

package org.sang.org.sang.算法;

/**
 * create by chuxia0811 on 2021/1/16
 */
public class 求素数 {
    
    
    public static void main(String[] args) {
    
    
        //求1~100以内的素数,素数即除了1和本身,没有能够被整除的数
        int count = 0;
        for (int i = 1; i <= 100; i++) {
    
    
            for (int j = 2; j < i; j++) {
    
    
                if (i % j == 0) {
    
    
                    break;
                }
                if (j+1==i){
    
    
                    System.out.println(i+"是素数");
                    count++;
                }
            }

        }
        System.out.println("1~100以内素数有:"+count+"个。");
    }
}

运行结果如下:

3是素数
5是素数
7是素数
11是素数
13是素数
17是素数
19是素数
23是素数
29是素数
31是素数
37是素数
41是素数
43是素数
47是素数
53是素数
59是素数
61是素数
67是素数
71是素数
73是素数
79是素数
83是素数
89是素数
97是素数
1~100以内素数有:24个。

7:回文数

package org.sang.org.sang.算法;

/**
 * @Author: chuxia0811
 * @Date: 2021/1/19 21:14
 * @Description :
 */
public class 回文数 {
    
    
    public static void main(String[] args) {
    
    
        //什么是回文数?判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数,例如 543212345
        //需求:计算10000-20000内的回文数个数
        for (int i = 10000; i < 20000; i++) {
    
    
            String num = String.valueOf(i);
           StringBuffer sb = new StringBuffer(num);
           sb.reverse();
           for (int j = 0;j<num.length();j++){
    
    
               if (num.charAt(j)!= sb.charAt(j)){
    
    
                   break;
               }
               if (j == num.length()-1){
    
    
                   System.out.println(i+"是回文数,");
               }
           }
        }
    }
}

运行结果如下:

10001是回文数,
10101是回文数,
10201是回文数,
10301是回文数,
10401是回文数,
。
。
。
。

8:斐波那契数列

package org.sang.org.sang.算法;

/**
 * @Author: chuxia0811
 * @Date: 2021/1/19 23:12
 * @Description :
 */
public class 斐波那契数列 {
    
    
    public static void main(String[] args) {
    
    
        //斐波那契数列:后一项为前两项之和,前两项都为1,例如:1,1,2,3,5,8,13,21,34.。。。。
        //需求:打印前100项斐波那契数列
        System.out.println("前30项斐波那契数列为:");
        for (int i = 1; i <= 30; i++) {
    
    
            System.out.print(getFibo(i) + ",");
        }

    }

    public static int getFibo(int i) {
    
    
        if (i == 1 || i == 2) {
    
    
            return i;
        } else {
    
    
            return getFibo(i - 1) + getFibo(i - 2);
        }
    }
}

运行结果如下:

30项斐波那契数列为:
1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,1346269,

9:递归阶乘

package org.sang.org.sang.算法;

/**
 * @Author: chuxia0811
 * @Date: 2021/1/20 22:28
 * @Description :
 */
public class 递归阶乘 {
    
    
    //需求:求1!+2!+3!+4!+。。。+10!
    public static void main(String[] args) {
    
    
        int sum = 0;
        for (int i = 1; i <= 10; i++) {
    
    
            sum += fun(i);
        }
        System.out.println("1!+2!+3!+4!+5!+6!+7!+8!+9!+10!=" + sum);
    }

    public static int fun(int i) {
    
    
        int count = 1;
        for (int j = 1; j <= i; j++) {
    
    
            if (i == 1) {
    
    
                break;
            }
            count = i * fun(i - 1);
        }
        return count;
    }
}

运行结果如下:


1!+2!+3!+4!+5!+6!+7!+8!+9!+10!=4037913

10:二分法查找

查找一个数组元素的下标

二分法适用于已经排好序的数组,定义两个变量,一个low,一个high,则mid=(low+high)/2.

查找一个数组元素的下标

如果 value==arr[mid],中间值正好等于要查找的值,则返回下标,return mid;

如果 value<arr[mid],要找的值小于中间的值,则再往数组的小端找,high=mid-1;

如果 value>arr[mid],要找的值大于中间的值,则再往数组的大端找,low=mid+1;

示例代码:
package org.sang.org.sang.算法;

import java.util.Arrays;

/**
 * @Author: chuxia0811
 * @Date: 2021/1/23 13:52
 * @Description :
 */
public class 二分法 {
    
    
    public static void main(String[] args) {
    
    
        //1.先定义一个数组,并排好序
        int[] arr = {
    
    10, 45, 25, 96, 128, -12, -55, 3, 78, 20};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        //2.用二分法查找元素96的下标
        System.out.println("元素96下标为:" + BinarySearch(arr, 96));
    }

    public static int BinarySearch(int[] arr, int args) {
    
    
        int low = 0;
        int high = arr.length - 1;
        while (low < high) {
    
    
            int mid = (low + high) / 2;
            if (args == arr[mid]) {
    
    
                return mid;
            }
            if (args > arr[mid]) {
    
    
                low = mid + 1;
            }
            if (args < arr[mid]) {
    
    
                high = mid - 1;
            }
        }
        return -1;
    }
}

运行结果如下:


[-55, -12, 3, 10, 20, 25, 45, 78, 96, 128]
元素96下标为:8

11:杨辉三角

杨辉三角规律说明:

1)第n行有n个数字
2)每一行第一个和最后一个数字都为1(二维数字表示为:arr[i][0]=1,arr[i][j]=0)
3)第n+1行的第i个数字等于第n行的i-1个数字加上第n行的i个数字(二维数组表示为:arr[i+1][j]=arr[i][j-1]+arr[i][j])

代码示例1:输出直角杨辉三角
package org.sang.org.sang.算法;

/**
 * @Author: chuxia0811
 * @Date: 2021/1/23 14:28
 * @Description :
 */
public class 杨辉三角 {
    
    
    public static void main(String[] args) {
    
    
        System.out.println("输出直角形状的杨辉三角:");
        YHSJ_1();

    }
    /*
     * @Author :chuxia0811
     * @Date: 2021/1/23  14:29
     * @Param:
     * @Return:
     * @Description :直角样式的杨辉三角示例
     */

    public static void YHSJ_1() {
    
    
        int[][] arr = new int[10][10];
        for (int i = 0; i < 10; i++) {
    
    
            for (int j = 0; j <= i; j++) {
    
    
                if (j == 0 || j == i) {
    
    
                    arr[i][j] = 1;
                } else {
    
    
                    arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
                }
                System.out.print(arr[i][j] + "\t");
            }
            System.out.println();
        }

    }
}

输出结果如下:

输出直角形状的杨辉三角:
1	
1	1	
1	2	1	
1	3	3	1	
1	4	6	4	1	
1	5	10	10	5	1	
1	6	15	20	15	6	1	
1	7	21	35	35	21	7	1	
1	8	28	56	70	56	28	8	1	
1	9	36	84	126	126	84	36	9	1
代码示例1:输出等腰杨辉三角
package org.sang.org.sang.算法;

/**
 * @Author: chuxia0811
 * @Date: 2021/1/23 14:28
 * @Description :
 */
public class 杨辉三角 {
    
    
    public static void main(String[] args) {
    
    
        System.out.println("输出等腰形状的杨辉三角:");
        YHSJ_2();

    }
    /*
     * @Author :chuxia0811
     * @Date: 2021/1/23  14:30
     * @Param:
     * @Return:
     * @Description :等腰三角形形状的杨辉三角
     */

    public static void YHSJ_2() {
    
    
        int[][] arr = new int[10][10];
        for (int i = 0; i < 10; i++) {
    
    
            for (int j = 0; j <= i; j++) {
    
    
                if (j == 0 || j == i) {
    
    
                    arr[i][j] = 1;
                } else {
    
    
                    arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
                }
            }
        }
        //打印等腰杨辉三角
        for (int i = 0; i < 10; i++) {
    
    
            for (int j = 0; j < 10 - i; j++) {
    
    
                System.out.print(" ");
            }
            for (int k = 0; k <= i; k++) {
    
    
                System.out.print(arr[i][k] + " ");
            }
            System.out.println();
        }
    }
}

运行结果如下:

输出等腰形状的杨辉三角:
          1 
         1 1 
        1 2 1 
       1 3 3 1 
      1 4 6 4 1 
     1 5 10 10 5 1 
    1 6 15 20 15 6 1 
   1 7 21 35 35 21 7 1 
  1 8 28 56 70 56 28 8 1 
 1 9 36 84 126 126 84 36 9 1 
 

12:打印菱形

代码示例1:打印实心菱形
package org.sang.org.sang.算法;

/**
 * @Author: chuxia0811
 * @Date: 2021/2/6 15:59
 * @Description :
 */
public class 菱形实心 {
    
    
    private static int row = 5;

    public static void main(String[] args) {
    
    
        //打印上半部分
        for (int i = 1; i <= row; i++) {
    
    
            for (int j = 1; j <= row - i; j++) {
    
    
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
    
    
                System.out.print("*");
            }
            System.out.println();
        }
        //打印下半部分
        for (int i = row - 1; i > 0; i--) {
    
    
            for (int j = 1; j <= row - i; j++) {
    
    
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
    
    
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

输出结果如下:

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *
代码示例2:打印空心菱形
package org.sang.org.sang.算法;

/**
 * @Author: chuxia0811
 * @Date: 2021/2/6 16:26
 * @Description :
 */
public class 菱形空心 {
    
    
    private static int row = 5;

    public static void main(String[] args) {
    
    
        // 1.打印上半部分
        for (int i = 1; i <= row; i++) {
    
    
            for (int j = 1; j <= row - i; j++) {
    
    
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
    
    
                if (j == 1 || j == 2 * i - 1) {
    
    
                    System.out.print("*");
                } else {
    
    
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
        // 打印下半部分
        for (int i = 5; i >= 1; i--) {
    
    
            for (int j = 1; j <= row - i; j++) {
    
    
                System.out.print(" ");
            }
            for (int j = 1; j <= 2 * i - 1; j++) {
    
    
                if (j == 1 || j == 2 * i - 1) {
    
    
                    System.out.print("*");
                } else {
    
    
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }
}

运行效果如下:

    *
   * *
  *   *
 *     *
*       *
*       *
 *     *
  *   *
   * *
    *

猜你喜欢

转载自blog.csdn.net/m0_37899908/article/details/112549762
今日推荐