20道Java基础算法题

import java.time.LocalDate;
import java.util.*;

public class Suanfa {

    public static void main(String[] args) {
//        test1(10);
//        test2();
//        test3();
//        test4(" abcUUU 12225 i*&@ ()J");
//        test5();
//        test6(new ArrayList<Integer>(Arrays.asList(5, 8, 0, 1, 7, 4, 3, 9, 1, 10)));
//        test7();
//        test8(13); //只要不是双数都能work
//        test9(9);
//        test10();
//        test11();
//        test12();
//        test13(12400);
//        test14(12321);
//        test15();
//        test16();
//        test17();
//        test18();
//        test19();
        test20();
    }


    /**
     * 题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,
     * 假如兔子都不死,问每个月的兔子总数为多少?
     */
    public static void test1(int n) {
        if (n<=0) {
            System.out.println("your parameter must more than 0");
        }
        for (int i=1; i<=n; i++) {
            System.out.println(i+": "+ fun1(i));
        }
    }

    public static int fun1(int n) {
        if (n > 2) {
            return fun1(n-1) + fun1(n-2);

        } else {
            return 1;

        }
    }


    /**
     * 判断101-200之间有多少个素数,并输出所有素数。
     * 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
     */
    public static void test2() {
        for (int i=101; i<=200; i++) {
            boolean sushu = true;
            for (int j=2; j<i; j++) {
                if (i%j == 0) {
                    sushu = false;
                    break;
                }
            }
            if (sushu) {
                System.out.println(i);
            }
        }
    }

    /**
     * 题目3:打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,其各位数字立方和等于该数本身。
     * 例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。
     * 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
     */
    public static void test3() {
        for (int i = 100; i <= 999; i++) {
            int ge = i % 10;
            int shi = (i / 10) % 10;
            int bai = i / 100;
            if (ge * ge * ge + shi * shi * shi + bai * bai * bai == i) {
                System.out.println(i);
            }
        }
    }

    /**
     * 题目4:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
     */
    public static void test4(String str) {
        char[] chars = str.toCharArray();
        int english = 0;
        int space = 0;
        int num = 0;
        int others = 0;
        for (char c: chars) {
            if (c == ' ') {
                space++;
            } else if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'){
                english++;
            } else if (c >= '0' && c<='9') {
                num++;
            } else {
                others++;
            }

        }
        System.out.println("字母:"+english);
        System.out.println("数字:"+num);
        System.out.println("空格:"+space);
        System.out.println("其他:"+others);
    }

    /**
     * 题目5:输入某年某月某日,判断这一天是这一年的第几天?
     */
    public static void test5() {
        LocalDate parse = LocalDate.parse("2021-02-03");
        int dayOfYear = parse.getDayOfYear();
        System.out.println(dayOfYear);

    }

    /**
     * 题目6:输入三个整数x,y,z,请把这三个数由小到大输出。
     */
    public static void test6(ArrayList<Integer> integers) {
        for (int i=0; i<integers.size(); i++) {
            for (int j=i; j<integers.size(); j++) {
                if (integers.get(i) > integers.get(j)) {
                    int tmp = integers.get(i);
                    integers.set(i, integers.get(j));
                    integers.set(j, tmp);
                }
            }
        }
        System.out.println(integers);
    }

    /**
     * 题目7:输出9*9口诀乘法表。
     */
    public static void test7() {
        for (int i=1; i<=9; i++) {
            for (int j=1; j<=i; j++) {
                System.out.print( j + "x" + i + "=" + j*i + " ");
            }
            System.out.println();
        }

    }

    /**
     * 题目8:打印出如下图案(三角形)
     * *
     * ***
     * *****
     * *******
     * *****
     * ***
     * *
     */
    public static void test8(int line) {
        int middle = (line+1)/2;
        for (int i=1 ; i<middle ; i++) {
            for (int j=1; j<=2*i -1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        for (int i=middle; i<=line; i++) {
            for (int j=1; j<=line-(i-middle)*2; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

    }

    /**
     * 题目9:打印出如下图案(菱形)
     */
    public static void test9(int line) {
        int middle = (line+1)/2;
        for (int i=1; i<middle; i++) {
            for (int j=1; j<=line; j++) {
                if (j> middle - i && j< middle + i) {
                    System.out.print("*");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }

        for (int i=middle; i<=line; i++) {
            for (int j=1; j<=line; j++) {
                if (j>=i+1-middle && j<=line-i+middle) {
                    System.out.print("*");
                } else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }

    /**
     * 题目10:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
     */
    public static void test10() {
        float fm = 1f;
        float fz = 1f;
        float sum = 0f;

        for (int i=0; i<20; i++) {
            float tmp = fm;
            fm = fz;
            fz = tmp + fz;
            sum += fz/fm;
            System.out.println((int)fz+"/"+(int)fm);
        }
        System.out.println(sum);
    }

    /**
     * 题目11:求1+2!+3!+...+20!的和。
     */
    public static void test11() {
        long sum = 0;
        long fac = 1;
        for (int i = 1; i <= 20; i++) {
            fac = fac * i;
            sum += fac;
        }
        System.out.println(sum);
    }

    /**
     *  题目12:利用递归方法求5!。
     */
    public static void test12() {
        System.out.println(fun12(5));
    }

    public static long fun12(long i) {
        if (i==1) {
            return 1;
        } else {
            return i * fun12(i - 1);
        }
    }


    /**
     * 题目13:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
     */
    public static void test13(long num) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(num);
        int length = stringBuffer.length();
        StringBuffer reverse = stringBuffer.reverse();
        System.out.println(length);
        System.out.println("origin: " + num);
        System.out.println("reverse: " + reverse);
    }


    /**
     * 题目14:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
     */
    public static void test14(long num) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(num);
        StringBuffer reverse = stringBuffer.reverse();
        String str = "" + num;
        System.out.println(str);
        System.out.println(num);
        if (str.equals(reverse.toString())) {
            System.out.println("是回文");
        } else {
            System.out.println("不是回文");
        }
    }

    /**
     * 题目15:对10个数进行排序。
     */
    public static void test15() {
        Random random = new Random();
        int[] array = new int[10];
        for (int i=0; i<array.length; i++) {
            array[i] = random.nextInt(10);
        }
        System.out.println(Arrays.toString(array));

        //排序
//        for (int i=0; i<array.length; i++) {
//            for (int j=i; j<array.length; j++) {
//                if (array[i] > array[j]) {
//                    int tmp = array[i];
//                    array[i] = array [j];
//                    array [j] = tmp;
//                }
//            }
//        }
//        System.out.println(Arrays.toString(array));

        Arrays.sort(array);
        System.out.println(Arrays.toString(array));

    }

    /**
     *  题目16:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
     */
    public static void test16() {
        //准备已经排好序的数组
        Random random = new Random();
        Integer[] array = new Integer[10];
        for (int i=0; i<array.length; i++) {
            array[i] = random.nextInt(10);
        }
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));

        Arrays.sort(array, Collections.reverseOrder());
        System.out.println(Arrays.toString(array));
        //准备完毕

        //先判断是什么顺序
        boolean isAscendingOrder = true;
        if (array[0] > array[array.length-1]) {
            isAscendingOrder = false;
        }

        int yourNum = 5;
        int[] newArray = new int[11];
        if (isAscendingOrder) {
            for (int i = 0; i <= array.length; i++) {
                if (yourNum > array[i]) {
                    newArray[i] = array[i];
                } else {
                    newArray[i] = yourNum;
                    for (int j= i; j<array.length;  j++) {
                        newArray[j+1] = array[j];
                    }
                    break;
                }
            }
        } else {
            for (int i = 0; i <= array.length; i++) {
                if (yourNum < array[i]) {
                    newArray[i] = array[i];
                } else {
                    newArray[i] = yourNum;
                    for (int j= i; j<array.length;  j++) {
                        newArray[j+1] = array[j];
                    }
                    break;
                }
            }
        }

        System.out.println(Arrays.toString(newArray));
    }

    /**
     *  题目17:打印出杨辉三角形(要求打印出10行如下图)
     * 1
     * 1   1
     * 1   2   1
     * 1   3   3   1
     * 1   4   6   4   1
     * 1   5   10   10   5   1
     */
    public static void test17() {
        int i, j;
        int a[][];
        int n = 10;
        a = new int[n][n];
        for (i = 0; i < n; i++) {
            a[i][i] = 1;
            a[i][0] = 1;
        }
        for (i = 2; i < n; i++) {
            for (j = 1; j <= i - 1; j++) {
                a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
            }
        }
        for (i = 0; i < n; i++) {
            for (j = 0; j <= i; j++) {
                System.out.printf(a[i][j] + "\t");
            }
            System.out.println();
        }
    }

    /**
     * 题目18:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
     */
    public static void test18() {
        Scanner in = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String mys = in.next();
        System.out.println("字符长度: "+mys.length());
    }

    /**
     * 题目19:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n
     */
    public static void test19() {
        Scanner in = new Scanner(System.in);
        System.out.println("请输入一个数字: ");
        String input = in.next();
        int num = Integer.parseInt(input);
        float sum = fun19(num, num%2 != 0);
        System.out.println(sum);
    }

    public static float fun19(int num, boolean isOddNum) {
        int initial = 2;
        if (isOddNum) {
            initial = 1;
        }

        float sum = 0;
        for (int i=initial; i<=num ; i+=2) {
            sum += 1/(float)i;
        }
        return sum;
    }

    /**
     * 题目20:计算字符串中子串出现的次数。并且打印下标的位置。
     */
    public static void test20() {
        String target = "abc";
        String origin = "abc9a9abc000jjjbcabc_8ab^abc";

        String[] array = origin.split(target);
        System.out.println("原字符串: "+origin);
        System.out.println(target + "出现的个数:" + array.length);
        int index = 0;

        for (int i=0; i<array.length; i++) {
            index+=array[i].length();
            System.out.println(target +"出现的下标位置: "+index);
            index += target.length();
        }
    }





}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值