0
点赞
收藏
分享

微信扫一扫

JAVA经典算法50题(3)【面试+工作】


JAVA经典算法50题(3)【面试+工作】

【程序21】   题目:求1+2!+3!+...+20!的和。
​1.程序分析:此程序只是把累加变成了累乘。

public class Demo21 {

    public static void main(String[] args) {

        long sum = 0;

        long fac = 1;

        for (int i = 1; i <= 20; i++) {

            fac = fac * i;

            sum += fac;

        }

        System.out.println(sum);

    }

}


【程序22】   题目:利用递归方法求5!。
​1.程序分析:递归公式:f(n)=f(n-1)*4!

import java.util.Scanner;

public class Demo22 {

    public static long fac(int n) {

        long value = 0;

        if (n == 1 || n == 0) {

            value = 1;

        } else if (n > 1) {

            value = n * fac(n - 1);

        }

        return value;

    }

    public static void main(String[] args) {

        System.out.println("请输入一个数:");

        Scanner in = new Scanner(System.in);

        int n = in.nextInt();

        System.out.println(n + "的阶乘为:" + fac(n));

    }

}


【程序23】   题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两
​岁。最后问第一个人,他说是10岁。请问第五个人多大?

1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。

直接求解:

public class Demo23 {

    public static void main(String[] args) {

        int n = 10;

        for (int i = 0; i < 4; i++) {

            n = n + 2;

        }

        System.out.println("第五个人" + n + "岁");

    }

}

递归求解:

public class Demo23 {

    public static int getAge(int n) {

        if (n == 1) {

            return 10;

        }

        return 2 + getAge(n - 1);

    }

    public static void main(String[] args) {

        System.out.println("第五个的年龄为" + getAge(5));

    }

}

【程序24】   题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 
​本题原方法:

import java.util.Scanner;

public class Demo24 {

    public static void main(String[] args) {

        Demo24 use = new Demo24();

        System.out.println("请输入:");

        Scanner in = new Scanner(System.in);

        long a = in.nextLong();

        if (a < 0 || a >= 100000) {

            System.out.println("Error Input, please run this program Again!");

            System.exit(0);

        }

        if (a >= 0 && a <= 9) {

            System.out.println(a + "是一位数");

            System.out.println("按逆序输出是:"  + a);

        } else if (a >= 10 && a <= 99) {

            System.out.println(a + "是二位数");

            System.out.println("按逆序输出是:");

            use.converse(a);

        } else if (a >= 100 && a <= 999) {

            System.out.println(a + "是三位数");

            System.out.println("按逆序输出是:");

            use.converse(a);

        } else if (a >= 1000 && a <= 9999) {

            System.out.println(a + "是四位数");

            System.out.println("按逆序输出是:");

            use.converse(a);

        } else if (a >= 10000 && a <= 99999) {

            System.out.println(a + "是五位数");

            System.out.println("按逆序输出是:");

            use.converse(a);

        }

    }

    public void converse(long l) {

        String s = Long.toString(l);

        char[] ch = s.toCharArray();

        for (int i = ch.length - 1; i >= 0; i--) {

            System.out.print(ch[i]);

        }

    }

}

个人版方法:

import java.util.Scanner;

public class Demo24 {

    public static void main(String[] args) {

        System.out.println("请输入:");

        Scanner in = new Scanner(System.in);

        String str = in.next();

        if (str.matches("\\d+")) { //正则表达式

            System.out.println("输入的是" + str.length() + "位数");

            StringBuffer buf = new StringBuffer(str);

            System.out.println(buf.reverse());//字符串反

        }

    }

}


【程序25】   题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
​原方法:

import java.util.Scanner;

public class Demo25 {

    static int[] a = new int[5];

    static int[] b = new int[5];

    public static void main(String[] args) {

        boolean is = false;

        System.out.println("Please input:");

        Scanner in = new Scanner(System.in);

        long l = in.nextLong();

        if (l > 99999 || l < 10000) {

            System.out.println("Input error, please input again!");

            l = in.nextLong();

        }

        for (int i = 4; i >= 0; i--) {

            a[i] = (int) (l / (long) Math.pow(10, i));

            l = (l % (long) Math.pow(10, i));

        }

        System.out.println();

        for (int i = 0, j = 0; i < 5; i++, j++) {

            b[j] = a[i];

        }

        for (int i = 0, j = 4; i < 5; i++, j--) {

            if (a[i] != b[j]) {

                is = false;

                break;

            } else {

                is = true;

            }

        }

        if (is == false) {

            System.out.println("is not a Palindrom!");

        } else if (is == true) {

            System.out.println("is a Palindrom!");

        }

    }

}

个人版:

import java.util.Scanner;

public class Demo25 {

    public static void main(String[] args) {

        System.out.println("请输入:");

        Scanner in = new Scanner(System.in);

        String str = in.next();

        int l = Integer.parseInt(str);//换成整数

        if (l < 10000 || l > 99999) {

            System.out.println("输入错误!");

            System.exit(0);

        }

        boolean is=false;

        char[] ch = str.toCharArray();

        for(int i=0;i<ch.length/2;i++){

            if(ch[i]!=ch[ch.length-i-1]){

                is=false;

            }else{

                is=true;

            }

        }

        if(is){

            System.out.println("这是一个回文!");

        }else{

            System.out.println("不是一个回文!");

        }

    }

}


【程序26】   题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
​1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。

import java.util.Scanner;

public class Demo26 {

    public static void main(String[] args) {

        char weekSecond;//保存第二字母

        Scanner in = new Scanner(System.in);//接收用户输入

        System.out.println("请输入星期的第一个字母:");

        String letter = in.next();

        if (letter.length() == 1) {//判断用户控制台输入字符串长度是否是一个字母

            char weekFirst = letter.charAt(0);//取第一个字符

            switch (weekFirst) {

            case 'm':

            case 'M':

                System.out.println("星期一(Monday)");

                break;

            case 't':

            case 'T':

                System.out.print("由于星期二(Tuesday)与星期四(Thursday)均以字母T开头,故需输入第二个字母才能正确判断:");

                letter = in.next();                 

                if (letter.length() == 1) {

                    weekSecond = letter.charAt(0);

                    if (weekSecond == 'U' || weekSecond == 'u') {

                        System.out.println("星期二(Tuesday)");

                        break;

                    } else if (weekSecond == 'H' || weekSecond == 'h') {

                        System.out.println("星期四(Thursday)");

                        break;

                    } else {

                        System.out.println("Error!");

                        break;

                    }

                } else {

                    System.out.println("输入错误,只能输入一个字母,程序结束!");

                    break;

                }

            case 'w':

            case 'W':

                System.out.println("星期三(Wednesday)");

                break;

            case 'f':

            case 'F':

                System.out.println("星期五(Friday)");

                break;

            case 's':

            case 'S':

                System.out.print("由于星期六(Saturday)与星期日(Sunday)均以字母S开头,故需输入第二个字母才能正确判断:");

                letter = in.next();

                if (letter.length() == 1) {

                    weekSecond = letter.charAt(0);

                    if (weekSecond == 'A' || weekSecond == 'a') {

                        System.out.println("星期六(Saturday)");

                        break;

                    } else if (weekSecond == 'U' || weekSecond == 'u') {

                        System.out.println("星期日(Sunday)");

                        break;

                    } else {

                        System.out.println("Error!");

                        break;

                    }

                } else {

                    System.out.println("输入错误,只能输入一个字母,程序结束!");

                    break;

                }

            default:

                System.out.println("输入错误,不能识别的星期值第一个字母,程序结束!");

                break;

            }

        } else {

            System.out.println("输入错误,只能输入一个字母,程序结束!");

        }

    }

}


【程序27】   题目:求100之内的素数
​public class Demo27 {

    public static void main(String args[]) {

        int sum, i;

        for (sum = 2; sum <= 100; sum++) {

            for (i = 2; i <= sum / 2; i++) {

                if (sum % i == 0)

                    break;

            }

            if (i > sum / 2)

                System.out.println(sum + "是素数");

        }

    }

}

public class Demo27{

    public static void main(String args[]){

        int w=1;

        for(int i=2;i<=100;i++){

            for(int j=2;j<i;j++){

                w=i%j;

                if(w==0)break;

                }

            if(w!=0)

                System.out.println(i+"是素数"); 

        }

    }

}


【程序28】   题目:对10个数进行排序。
​1.程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比较,并进行交换。

本例代码为生成随机10个数排序,并输入1个数,插入重排序输出:

import java.util.Arrays;

import java.util.Random;

import java.util.Scanner;

public class Demo28 {

    public static void main(String[] args) {

        int arr[] = new int[11];

        Random r = new Random();

        for (int i = 0; i < 10; i++) {

            arr[i] = r.nextInt(100) + 1; //得到10个100以内的整数

        }

        Arrays.sort(arr);

        for (int i = 0; i < arr.length; i++) {

            System.out.print(arr[i] +"\t");

        }

        System.out.print("\nPlease Input a int number:" );

        Scanner in = new Scanner(System.in);

        arr[10] = in.nextInt(); 

        Arrays.sort(arr);

        for (int i = 0; i < arr.length; i++) {

            System.out.print(arr[i] +"\t");

        }

    }

}

个人代码:

import java.util.Arrays;

import java.util.Scanner;

public class Demo28 {

    public static void main(String[] args) {

        System.out.println("请输入10个数:");

        Scanner in = new Scanner(System.in);

        int[] arr = new int[10];

        for (int i = 0; i < 10; i++) {

            arr[i] = in.nextInt(); 

        }

        System.out.println("原数组为:");

        for (int x : arr) {//foreach遍历

            System.out.print( x + "\t");

        }

        Arrays.sort(arr);

        System.out.println();

        System.out.println("排序后为:");

        for (int i = 0; i < arr.length; i++) {

            System.out.print(arr[i] + "\t");

        }

    }

}


【程序29】   题目:求一个3*3矩阵主对角线元素之和。
​1.程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

public class Demo29 {

    public static void main(String[] args) {

        double sum = 0;

        int array[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 7, 8 } };

        for (int i = 0; i < 3; i++)

            for (int j = 0; j < 3; j++) {

                if (i == j)

                    sum = sum + array[i][j];

            }

        System.out.println(sum);

    }

}

主负对角线:

 for(i=0;i<n;i++)

         for(j=0;j<n;j++)

         {

            if(i==j) sum1+=a[i][j];

            if(i+j==n-1) sum2+=a[i][j];

         }


【程序30】   题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
​1.程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。

import java.util.Random;

public class Demo30 {

    public static void main(String[] args) {

        int temp = 0;

        int arr[] = new int[12];

        Random r = new Random();

        for (int i = 0; i <= 10; i++)

            arr[i] = r.nextInt(1000);

        for (int i = 0; i <= 10; i++)

            System.out.print(arr[i] + "\t");

        for (int i = 0; i <= 9; i++)

            for (int k = i + 1; k <= 10; k++)

                if (arr[i] > arr[k]) {

                    temp = arr[i];

                    arr[i] = arr[k];

                    arr[k] = temp;

                }

        System.out.println();

        for (int k = 0; k <= 10; k++)

            System.out.print(arr[k] + "\t");

        arr[11] = r.nextInt(1000);

        for (int k = 0; k <= 10; k++)

            if (arr[k] > arr[11]) {

                temp = arr[11];

                for (int j = 11; j >= k + 1; j--)

                    arr[j] = arr[j - 1];

                    arr[k] = temp;

            }

        System.out.println();

        for (int k = 0; k <= 11; k++)

            System.out.print(arr[k] + "\t");

    }

}     


JAVA经典算法50题(3)【面试+工作】_程序分析

JAVA经典算法50题(3)【面试+工作】_程序分析_02JAVA经典算法50题(3)【面试+工作】_i++_03JAVA经典算法50题(3)【面试+工作】_i++_04JAVA经典算法50题(3)【面试+工作】_java_05



举报

相关推荐

0 条评论