java题库(基础)

1、题目:两数之和

题目描述:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。
示例:

输入:nums = [3,2,4], target = 6
输出:[1,2]

题目解答
方法一:暴力枚举

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int n = nums.length;
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (nums[i] + nums[j] == target) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }
}

方法二:哈希表

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
        for (int i = 0; i < nums.length; ++i) {
            if (hashtable.containsKey(target - nums[i])) {
                return new int[]{hashtable.get(target - nums[i]), i};
            }
            hashtable.put(nums[i], i);
        }
        return new int[0];
    }
}

2、题目:输出所有水仙花数

// 输出所有水仙花数,各个位数的数字立方和等于其本身
// 153 = 1*1*1 + 3*3*3 + 5*5*5
for (int i = 100; i < 1000; i++) {
    int ge = i % 10;
    int shi = (i / 10) % 10;
    int bai = i / 100;
    if (i == bai * bai * bai + ge * ge * ge + shi * shi * shi) {
        System.out.println(i);
    }
}

3、题目:输入两个数m, n 求最大公约数和最小公倍数

//最大公约数
int m = 12;
int n = 20;
int min = (m > n) ? m : n;
for (int i = min; i >= 1; i--) {
    if (m % i == 0 && n % i == 0) {
        System.out.println("最大公倍数:" + i);
        break;
    }
}
//最小公倍数
int max = (m > n) ? m : n;
for (int i = max; i < m * n; i++) {
    if (i % m == 0 && i % n == 0) {
        System.out.println("最小公约数:" + i);
        break;
    }
}

4、题目:找出100以内所有的素数(质数)?100000以内呢?

方法一:

// 找出100以内所有的素数(质数)?100000以内呢?
//什么是质数? 除了1和它本身能整除的自然数。例如:2、3、5、7、11、13、17……
for (int i = 2; i < 100; i++) {
    //记录i的约束的个数(从2开始,到i-1为止)
    int number = 0;
    for (int j = 2; j < i; j++) {
        if (i%j==0){
            number++;
        }
    }
    if (number==0){
        System.out.println(i);
    }
}

方法二:

// 找出100以内所有的素数(质数)?100000以内呢?
//什么是质数? 除了1和它本身能整除的自然数。例如:2、3、5、7、11、13、17……
//标记
boolean isFlag = true;
for (int i = 2; i < 100; i++) {
    for (int j = 2; j < i; j++) {
        if (i%j==0){
            isFlag=false;
        }
    }
    if (isFlag==true){
        System.out.println(i);
    }
    // 重置标记
    isFlag = true;
}

100000以内的质数个数,体会不同的算法实现,其性能差别。

方式一:

        // 找出100以内所有的素数(质数)?100000以内呢?
        //什么是质数? 除了1和它本身能整除的自然数。例如:2、3、5、7、11、13、17……

        //标记
        boolean isFlag = true;
        int count = 0; // 记录质数的个数

        //获取当前系统的时间
        long start = System.currentTimeMillis();

        for (int i = 2; i < 100000; i++) {
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    isFlag = false;
                }
            }

            if (isFlag == true) {
                count++;
            }
            // 重置标记
            isFlag = true;
        }
        long end = System.currentTimeMillis();
        System.out.println("质数总共有:" + count);
        System.out.println("花费的时间为:" + (end - start));

结果:
质数总共有:9592
花费的时间为:6726

方式二:
对方式一进行优化

//标记
boolean isFlag = true;
int count = 0; // 记录质数的个数

//获取当前系统的时间
long start = System.currentTimeMillis();

for (int i = 2; i < 100000; i++) {
    for (int j = 2; j < i; j++) {
        if (i % j == 0) {
            isFlag = false;
            break; //针对非质数有效果
        }
    }

    if (isFlag == true) {
        count++;
    }
    // 重置标记
    isFlag = true;
}
long end = System.currentTimeMillis();
System.out.println("质数总共有:" + count);
System.out.println("花费的时间为:" + (end - start));

结果:
质数总共有:9592
花费的时间为:722

方式三:对方式二进行优化

//标记
boolean isFlag = true;
int count = 0; // 记录质数的个数

//获取当前系统的时间
long start = System.currentTimeMillis();

for (int i = 2; i < 100000; i++) {
    for (int j = 2; j <= Math.sqrt(i); j++) {
        if (i % j == 0) {
            isFlag = false;
            break; //针对非质数有效果
        }
    }

    if (isFlag == true) {
        count++;
    }
    // 重置标记
    isFlag = true;
}
long end = System.currentTimeMillis();
System.out.println("质数总共有:" + count);
System.out.println("花费的时间为:" + (end - start));

结果:
质数总共有:9592
花费的时间为:7

5、题目:使用二维数组打印一个10行杨辉三角

package com.aiguigu.oneArray;
/**
 * ClassName: YangHuiTest
 * Description:
 * 案例:使用二维数组打印一个10行杨辉三角
 * 提示:
 * 1、第一行有一个元素,第n行有第n个元素
 * 2、每一行的第一个元素和最后一个元素都是1
 * 3、从第三个元素开始,对于非第一个元素和最后一个元素的元素。即:
 * yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
 */
public class YangHuiTest {
    public static void main(String[] args) {
        // 1、创建二维数组
        int[][] yanghui = new int[10][];

        //2、使用循环结构,初始化外层数组元素
        for (int i = 0; i < yanghui.length; i++) {
            yanghui[i] = new int[i + 1];

            //3、给数组的元素赋值
            // (1)将首末元素初始化为 1
            yanghui[i][0] = yanghui[i][i] = 1;

            //(2)计算杨辉三角
            for (int j = 1; j < yanghui[i].length - 1; j++) {
                yanghui[i][j] = yanghui[i - 1][j - 1] + yanghui[i - 1][j];
            }
        }

        // 遍历二维数组
        for (int i = 0; i < yanghui.length; i++) {
            for (int j = 0; j < yanghui[i].length; j++) {
                System.out.print(yanghui[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

6、题目:评委打分

  • 案例:评委打分
  • (1)在编程比赛中,10位评委为参赛选手打分,分数分别为:5, 4, 6, 8, 9, 0, 1, 2, 7, 3
  • (2)求选手最后得分(去除掉以恶最低分和一个最高分之后其余8位评委打分的平均值)
package com.aiguigu.oneArray;

/**
 * ClassName: OneArrayExer02
 * Description:
 * 案例:评委打分
 * (1)在编程比赛中,10位评委为参赛选手打分,分数分别为:5, 4, 6, 8, 9, 0, 1, 2, 7, 3
 * (2)求选手最后得分(去除掉以恶最低分和一个最高分之后其余8位评委打分的平均值)
 */
public class OneArrayExer02 {
    public static void main(String[] args) {
        int[] score = {5, 4, 6, 8, 9, 0, 1, 2, 7, 3};
        int max = score[0];
        int min = score[0];
        int sum = 0;
        for (int i = 0; i < score.length; i++) {
            // 求最低分
            if (score[i] < min) {
                min = score[i];
            }
            //求最高分
            if (max < score[i]) {
                max = score[i];
            }
            // 求总和
            sum += score[i];
        }
        System.out.println("max = " + max);
        System.out.println("min = " + min);
        System.out.println("sum = " + sum);

        // 评委的平均分(去除最高分和一个最低分)
        sum = sum - min - max;
        double avgValue = sum / 8.0;
        System.out.println("评委得分平均值为:" + avgValue);
    }
}

7、题目:创建一个长度为6的int型数组,要求数组元素的值都在1-30之间。且是随机赋值,且是随机赋值。同时,要求元素的值各不相同

方法一:常规思路

package com.aiguigu.oneArray;

public class OneArrayExer03 {
    public static void main(String[] args) {
        int[] arry = new int[6];
        int tmp = 0;
        for (int i = 0; i < arry.length; i++) {
            // 给第i个赋值
            arry[i] = (int) (Math.random() * (30 - 1 + 1) + 1);
            // 设置标记,表示是否重复
            boolean flag = false;
            while (true){
                // 判断新加入元素是否重复
                for (int j = 0; j < i; j++) {
                    if (arry[i] == arry[j]){
                        // 如果重复,flag变为true
                        flag = true;
                        break;  // 不在判断以后的元素
                    }
                }
                // 若重复重新赋值
                if (flag){
                    arry[i] = (int) (Math.random() * (30 - 1 + 1) + 1);
                    flag = false;
                    // 继续判断
                    continue;
                }
                break;
            }

        }

        // 展示数组
        for (int i = 0; i < arry.length; i++) {
            System.out.print(arry[i]+"\t");
        }
    }
}

方法二:打开思维

package com.aiguigu.oneArray;

/**
 * ClassName: OneArrayExer03
 * Description:
 * 创建一个长度为 6 的int型数组,要求数组元素的值都在1-30之间。且是随机赋值,且是随机赋值。同时,要求元素的值各不相同
 *
 */
public class OneArrayExer03 {
    public static void main(String[] args) {
        int[] arry = new int[20];
        int tmp = 0;
        for (int i = 0; i < arry.length; i++) {
            // 给第i个赋值
            arry[i] = (int) (Math.random() * (30 - 1 + 1) + 1);

            // 判断新加入元素是否重复
            for (int j = 0; j < i; j++) {
                if (arry[i] == arry[j]){
                    // 如果重复,重新赋值
                    i--;
                    break;
                }
            }
        }
        
        // 展示数组
        for (int i = 0; i < arry.length; i++) {
            System.out.print(arry[i]+"\t");
        }
    }
}

8、题目:回形数

从键盘输入一个整数(1~20) ,则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。

例如: 输入数字2,则程序输出:
1 2
4 3

输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

//方式1
public class RectangleTest {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("输入一个数字");
		int len = scanner.nextInt();
		int[][] arr = new int[len][len];
		
		int s = len * len;
		/*
		 * k = 1:向右
		 * k = 2:向下
		 * k = 3:向左
		 * k = 4:向上
		 */
		int k = 1;
		int i = 0,j = 0;
		for(int m = 1;m <= s;m++){
			if(k == 1){
				if(j < len && arr[i][j] == 0){
					arr[i][j++] = m;
				}else{
					k = 2;
					i++;  
					j--;
					m--;
				}
			}else if(k == 2){
				if(i < len && arr[i][j] == 0){
					arr[i++][j] = m;
				}else{
					k = 3;
					i--;
					j--;
					m--;
				}
			}else if(k == 3){
				if(j >= 0 && arr[i][j] == 0){
					arr[i][j--] = m;
				}else{
					k = 4;
					i--;
					j++;
					m--;
				}
			}else if(k == 4){
				if(i >= 0 && arr[i][j] == 0){
					arr[i--][j] = m;
				}else{
					k = 1;
					i++;
					j++;
					m--;
				}
			}
		}
		
		//遍历
		for(int m = 0;m < arr.length;m++){
			for(int n = 0;n < arr[m].length;n++){
				System.out.print(arr[m][n] + "\t");
			}
			System.out.println();
		}
	}
}

方式二:

//方式2
/*
	01 02 03 04 05 06 07 
	24 25 26 27 28 29 08 
	23 40 41 42 43 30 09 
	22 39 48 49 44 31 10 
	21 38 47 46 45 32 11 
	20 37 36 35 34 33 12 
	19 18 17 16 15 14 13 
 */
public class RectangleTest1 {

	public static void main(String[] args) {
		int n = 7;
		int[][] arr = new int[n][n];
		
		int count = 0; //要显示的数据
		int maxX = n-1; //x轴的最大下标
		int maxY = n-1; //Y轴的最大下标
		int minX = 0; //x轴的最小下标
		int minY = 0; //Y轴的最小下标
		while(minX<=maxX) {
			for(int x=minX;x<=maxX;x++) {
				arr[minY][x] = ++count;
			}
			minY++;
			for(int y=minY;y<=maxY;y++) {
				arr[y][maxX] = ++count;
			}
			maxX--;
			for(int x=maxX;x>=minX;x--) {
				arr[maxY][x] = ++count;
			}
			maxY--;
			for(int y=maxY;y>=minY;y--) {
				arr[y][minX] = ++count;
			}
			minX++;
		}
		
		
		for(int i=0;i<arr.length;i++) {
			for(int j=0;j<arr.length;j++) {
				String space = (arr[i][j]+"").length()==1 ? "0":"";
				System.out.print(space+arr[i][j]+" ");
			}
			System.out.println();
		}
	}
}

9、题目:数组的扩容

现有数组 int[] arr = new int[]{1,2,3,4,5}; ,现将数组长度扩容1倍,并将10,20,30三个数据添加到arr数组中,如何操作?

package com.study.search_sort;

/**
 * ClassName: ArrayExpansion
 * Package: com.study.search_sort
 * Description: 案例: 数组扩容
 * 现有数组 int[] arr = new int[]{1,2,3,4,5}; ,现将数组长度扩容1倍,并将10,20,30三个数据添加到arr数组中,如何操作?
 *
 * @Author ShiQiFei
 * @Create 2023/6/9 16:31
 * @Version 1.0
 */
public class ArrayExpansion {
    public static void main(String[] args) {

        int[] arr = new int[]{1,2,3,4,5};

        // 扩容一倍
        // int[] newArr = new int[arr.length * 2];
        // or
        // 左移一位
        int[] newArr = new int[arr.length << 1];

        // 将原有数组元素赋值到新数组中
        for (int i = 0; i < arr.length; i++) {
            newArr[i] = arr[i];
        }

        // 将新元素赋值
        newArr[arr.length] = 10;
        newArr[arr.length+1] = 20;
        newArr[arr.length+2] = 30;

        // 将新数组地址赋给原有数组变量
        arr = newArr;

        // show
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
    }
}

10、题目:数组的缩容

现有数组 int[] arr={1,2,3,4,5,6,7}。现需删除数组中索引为4的元素。

package com.study.search_sort;

/**
 * ClassName: ArrayScaling
 * Package: com.study.search_sort
 * Description:
 * 现有数组 int[] arr={1,2,3,4,5,6,7}。现需删除数组中索引为4的元素。
 *
 * @Author ShiQiFei
 * @Create 2023/6/10 10:01
 * @Version 1.0
 */
public class ArrayScaling {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 6, 7};
        int deleteIndex = 4;

        // 方法一:修改原有数组
        // 删除元素,后面的元素向前移
        for (int i = deleteIndex; i < arr.length-1; i++) {
            arr[i] = arr[i+1];
        }
        // 将最后一个元素设为默认值
        arr[arr.length-1] = 0;

        // 结果:1	2	3	4	6	7	0

        // 方法二:创建新数组
        // 删除元素,创建一个新数组,将剩余元素存放到新数组中
        int[] newArr = new int[arr.length - 1];
        for (int i = 0; i < arr.length; i++) {

            // 索引为4删除
            if (i == deleteIndex) {
                continue;
            }

            // 赋值
            if (i > deleteIndex) {
                newArr[i - 1] = arr[i];
            } else {
                newArr[i] = arr[i];
            }
        }

        // 将新地址赋值给arr
        arr = newArr;

        // 结果:1	2	3	4	6	7

        // show
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
    }
}

11、题目:线性查找

  • 定义数组:int[] arr = {34, 54, 3, 2, 65, 7, 34, 5, 76, 34, 67};
  • 查找数组元素 5 是否在上述数组中出现过?若出现,数组对应的索引值。
package com.study.search_sort;

/**
 * ClassName: LinearSearch
 * Package: com.study.search_sort
 * Description: 线性查找
 * 定义数组:int[] arr = {34, 54, 3, 2, 65, 7, 34, 5, 76, 34, 67};
 * 查找数组元素 5 是否在上述数组中出现过?若出现,数组对应的索引值。
 *
 * @Author ShiQiFei
 * @Create 2023/6/10 10:32
 * @Version 1.0
 */
public class LinearSearch {
    public static void main(String[] args) {
        int[] arr = {34, 54, 3, 2, 65, 7, 34, 5, 76, 34, 67};
        int target = 5;
        // 线性查找:从第一个元素挨个查找数组中的元素,若有存在即返回当前元素的索引值。
        // 方式一:根据标志判断又没找到
//        boolean isFlag = false;
//        for (int i = 0; i < arr.length; i++) {
//            if (target == arr[i]){
//                System.out.println("找到了,索引为 "+i);
//                isFlag = true;
//                break;
//            }
//        }
//        if (!isFlag){
//            System.out.println("未找到了!!!");
//        }


        // 方式二:根据数组长度判断是否找到
        int i = 0;
        for (; i < arr.length; i++) {
            if (target == arr[i]){
                System.out.println("找到了,索引为 "+i);
                break;
            }
        }
        if (i==arr.length){
            System.out.println("未找到了!!!");
        }


    }

}

12、题目:二分查找

  • 前提:数组内元素必须是有序的!!!
  • 定义数组:int[] arr = {2, 4, 5, 8, 12, 15, 19, 26, 37, 49, 51, 66, 89, 100};
  • 查找数组元素 5 是否在上述数组中出现过?若出现,数组对应的索引值。
  • 实现逻辑:
    在这里插入图片描述
  • 实现代码
package com.study.search_sort;

/**
 * ClassName: BinarySearch
 * Package: com.study.search_sort
 * Description:
 * 定义数组:int[] arr = {2, 4, 5, 8, 12, 15, 19, 26, 37, 49, 51, 66, 89, 100};
 * 查找数组元素 5 是否在上述数组中出现过?若出现,数组对应的索引值。
 *
 * @Author ShiQiFei
 * @Create 2023/6/10 10:57
 * @Version 1.0
 */
public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = {2, 4, 5, 8, 12, 15, 19, 26, 37, 49, 51, 66, 89, 100};
        int target = 5;

        // 默认首索引
        int head = 0;
        // 默认尾索引
        int end = arr.length - 1;
        // 设置标志。判断是都找到
        boolean isFlag = true;
        while (head <= end) {
            // 中间索引
            int middle = (head + end) / 2;
            //判断目标值与数组中间值是否相等
            if (target == arr[middle]) {
                System.out.println("找到了,索引为 " + middle);
                isFlag = false;
                break;
            } else if (target < arr[middle]) { //查找左边元素
                end = middle - 1;
            } else { //查找右边元素
                head = middle + 1;
            }
        }
        if (isFlag){
            System.out.println("么有找到了!!! ");
        }
    }
}

13、题目:冒泡排序

对现有数组进行排序:
int[] arr = {34, 54, 3, 2, 65, 7, 34, 5, 76, 34, 67, 100};

package com.study.search_sort;

/**
 * ClassName: BubbleSort
 * Package: com.study.search_sort
 * Description: 冒泡排序
 * 思想:每一次比较“相邻(位置相邻)”元素,如果它们不符合目标顺序(例如:从小到大),
 * 就交换它们,经过多轮比较,最终实现排序。
 * (例如:从小到大)	 每一轮可以把最大的沉底,或最小的冒顶。
 *
 * @Author ShiQiFei
 * @Create 2023/6/10 12:47
 * @Version 1.0
 */
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {34, 54, 3, 2, 65, 7, 34, 5, 76, 34, 67, 100};

        // 遍历
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        // 比较
        for (int i = 0; i < arr.length - 1; i++) {
            boolean flag = true;   //假设数组是有序的
            // 交换一次,将最大的元素一直到了最右边
            // 小优化:可知已将最大的放到了最左边,可以就不用与最后一个相比即:第一轮结束后 arr.length - 1 - 1
            for (int j = 0; j < arr.length - 1 - i; j++) {
                // 判断大小,若大就后移。
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = false; // 如果元素发生了交换,说明数组没有排好序
                }
            }
            if (flag){
                break;
            }
        }

        // 排序后数组
        System.out.println();
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }

    }
}

14、题目:Arrays库的使用

package com.study.arrays;

import java.util.Arrays;

/**
 * ClassName: ArraysTest
 * Package: com.study.search_sort
 * Description: 数组工具类的使用
 *
 * @Author ShiQiFei
 * @Create 2023/6/10 15:58
 * @Version 1.0
 */
public class ArraysTest {
    public static void main(String[] args) {
        int[] arr1 = new int[]{1, 4, 7, 10, -30};
        int[] arr2 = new int[]{1, 4, 7, 10, -30};
        // int[] arr2 = new int[]{1, 4, 7, 10, -30};  // false

        // 1、 boolean equals(int[] a, int[] b); 比较数组元素是否依次相等
        boolean isEquals = Arrays.equals(arr1, arr2);  // 注意 if(arr1==arr2)判断的是地址是否相等
        System.out.println(isEquals); // true

        // 2、String toString(int[] a): 输出数组元素信息
        System.out.println(arr1); //[I@4eec7777
        System.out.println(Arrays.toString(arr1)); // [9, -16, 30, 23, -30, -49, 25, 21, 30]

        // 3、void fill(int[] a, int val):将指定值填充到数组之中
        Arrays.fill(arr1, 33);
        System.out.println(Arrays.toString(arr1)); // [33, 33, 33, 33, 33]

        // 4、void sort(int[] a): 使用快速排序算法实现的排序
        int[] arr3 = new int[]{1, 4, 7, 10, -30};
        Arrays.sort(arr3);
        System.out.println(Arrays.toString(arr3)); // [-30, 1, 4, 7, 10]

        // 5、int binarySearch(int[] a, int key): 二分查找
        int index = Arrays.binarySearch(arr3, 5);
        System.out.println(index);  // -4 负数代表没找到, 若大于等于0则找到了

    }

}

15、题目:求数组的最大子序列和

  • 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
  • 求所有子数组的和的最大值。要求时间复杂度为O(n)。
    例如:输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
    因此输出为该子数组的和18。
public class ArrDemo {
	public static void main(String[] args) {
		int[] arr = new int[]{1, -2, 3, 10, -4, 7, 2, -5};
		int i = getGreatestSum(arr);
		System.out.println(i);
	}
	
	public static int getGreatestSum(int[] arr){
		int greatestSum = 0;
		if(arr == null || arr.length == 0){
			return 0;
		}
		int temp = greatestSum;
		for(int i = 0;i < arr.length;i++){
			temp += arr[i];
			
			if(temp < 0){
				temp = 0;
			}
			
			if(temp > greatestSum){
				greatestSum = temp;
			}
		}
		if(greatestSum == 0){
			greatestSum = arr[0];
			for(int i = 1;i < arr.length;i++){
				if(greatestSum < arr[i]){
					greatestSum = arr[i];
				}
			}
		}
		return greatestSum;
	}
}

16、题目:OOP小练习

  • 案例:
  • (1)声明一个MyDate类型,有属性:年year 月month 日day
  • (2)声明一个Employee类型,包含属性:编号、姓名、年龄、薪资、生日(MyDate类型)
  • (3)在EmployeeTest测试类中的main()中,创建两个员工对象,并为他们的姓名和生日赋值、并显示。

MyDate类

package com.study.field.Exer01;

/**
 * ClassName: MyDate
 * Package: com.study.field.Exer01
 * Description:
 *
 * @Author ShiQiFei
 * @Create 2023/6/10 20:40
 * @Version 1.0
 */
public class MyDate {
    String year;
    String month;
    String day;
}

Employee类

package com.study.field.Exer01;

/**
 * ClassName: Employee
 * Package: com.study.field.Exer01
 * Description:
 *
 * @Author ShiQiFei
 * @Create 2023/6/10 20:31
 * @Version 1.0
 */
public class Employee {

    MyDate birthday;
    int id;
    String name;
    int age;
    double salary;
}

EmployeeTest类

package com.study.field.Exer01;

/**
 * ClassName: EmployeeTest
 * Package: com.study.field.Exer01
 * Description: OOP
 * 案例:
 * (1)声明一个MyDate类型,有属性:年year 月month 日day
 * (2)声明一个Employee类型,包含属性:编号、姓名、年龄、薪资、生日(MyDate类型)
 * (3)在EmployeeTest测试类中的main()中,创建两个员工对象,并为他们的姓名和生日赋值、并显示。
 *
 * @Author ShiQiFei
 * @Create 2023/6/10 20:31
 * @Version 1.0
 */
public class EmployeeTest {
    public static void main(String[] args) {
        Employee employee = new Employee();
        employee.id = 123;
        employee.name = "tom";
        employee.age = 12;
        employee.salary = 10000;
        employee.birthday = new MyDate();
        employee.birthday.year = "2022";
        employee.birthday.month = "12";
        employee.birthday.day = "01";

        Employee employee1 = new Employee();
        employee1.id = 1223;
        employee1.name = "som";
        employee1.age = 18;
        employee1.salary = 20000;
        employee1.birthday = new MyDate();
        employee1.birthday.year = "2002";
        employee1.birthday.month = "22";
        employee1.birthday.day = "06";

        System.out.println(employee.id + " " + employee.name + " " + employee.age + " " + employee.salary
                + " " + employee.birthday.year+":"+ employee.birthday.month+":"+ employee.birthday.day);
        System.out.println(employee1.id + " " + employee1.name + " " + employee1.age + " " + employee1.salary
                + " " + employee1.birthday.year+":"+ employee1.birthday.month+":"+ employee1.birthday.day);
    }
}

17、题目:对象数组

案例

定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示:

  1. 生成随机数:Math.random(),返回值类型double;
  2. 四舍五入取整:Math.round(double d),返回值类型long。

代码:
Student

package com.study.field.Exer05;

/**
 * ClassName: Student
 * Package: com.study.field.Exer05
 * Description:
 *
 * @Author ShiQiFei
 * @Create 2023/6/11 18:37
 * @Version 1.0
 */
public class Student {
    //学号
    int number;
    // 年级
    int state;
    // 成绩
    int score;

    // 声明一个方法打印属性
    public String show(){
        return "学号:" + number + " 年级:" + state + " 成绩:" + score;
    }
}

StudentTest

package com.study.field.Exer05;

/**
 * ClassName: StudentTest
 * Package: com.study.field.Exer05
 * Description:
 *
 * @Author ShiQiFei
 * @Create 2023/6/11 18:38
 * @Version 1.0
 */
public class StudentTest {
    public static void main(String[] args) {

        // 对象数组
        Student[] students = new Student[20];

        // 为学生赋值
        for (int i = 0; i < students.length; i++) {
            // 创建第一个学生对象
            students[i] = new Student();
            students[i].number = i + 1;
            // 学生随机分到1-6年级
            students[i].state = (int) (Math.random() * 6 + 1);

            // 分数随机[0,100]
            students[i].score = (int) (Math.random() * 101);
        }

        // 打印出三年级的学生
        for (int i = 0; i < students.length; i++) {
            Student stu = students[i];

            if (stu.state == 3) {
                // System.out.println("学号:" + stu.number + " 年级:" + stu.state + " 成绩:" + stu.score);
                //System.out.println(stu.show());
            }
        }

        // 冒泡排序按学生成绩,遍历所有学生成绩
//        for (int i = 0, j = 1; i < students.length-1, j < (students.length-1-i); i++, j++) {
//
//        }
        for (int i = 0; i < students.length - 1; i++) {
            for (int j = 0; j < students.length - 1 - i; j++) {
                if (students[j].score > students[j + 1].score) {
                    // 注意!!! 此处交换的为对象,而不是对象的成绩
                    Student temp = students[j];
                    students[j] = students[j + 1];
                    students[j + 1] = temp;
                }
            }
        }

        for (int i = 0; i < students.length; i++) {
            System.out.println(students[i].show());
        }

        //System.out.println(Arrays.toString());


        //System.out.println(Arrays.toString(student));
    }
}

18、题目:递归函数应用

要求:利用递归函数实现

public class RecursionTest {
    public static void main(String[] args) {
        RecursionTest rt = new RecursionTest();
        // 1-100的和
        System.out.println(rt.getSum(100));  // 5050
        // 10!
        System.out.println(rt.getFactorial(10)); // 3628800
        // 斐波那契数列 第10个数为多少
        System.out.println(rt.f(10)); // 55

        System.out.println(rt.f2(10)); // -3771

        System.out.println(rt.f3(10)); // 89

    }

    /*
     * 举例1;计算1-100内自然数的总和
     *
     * */
    public int getSum(int num) {
        if (num == 1) {
            return 1;
        }
        return num + getSum(num - 1);
    }

    /*
     * 举例2:计算n的阶乘
     *
     * */
    public int getFactorial(int num) {
        if (num == 1) {
            return 1;
        }
        return num * getFactorial(num - 1);
    }

    /*
     * 举例3:斐波那契数列
     * 1 1 2 3 5 8 13 21
     * 从第三个开始,第三个数 = 第一个数+第二个数
     *
     * */
    public int f(int n) {
        if (n == 1) {
            return 1;
        } else if (n == 2) {
            return 1;
        } else {
            return f(n - 1) + f(n - 2);
        }
    }

    /*
     * 举例4:已知一个数列:f(20) = 1, f(21) = 4, f(n+2) = 2*f(n+1)+f(n)
     * 其中n是大于0的整数,求f(10)的值。
     *
     * */
    public int f2(int n) {
        if (n == 20) {
            return 1;
        } else if (n == 21) {
            return 4;
        } else {
            return f2(n + 2) - 2 * f2(n + 1); // 注意方程式要朝着已知的方向去推断
        }
    }


    /*
     * 举例5:已知一个数列:f(0) = 1, f(1) = 4, f(n+2) = 2*f(n+1)+f(n)
     * 其中n是大于0的整数,求f(10)的值。
     *
     * */
    public int f3(int n) {
        if (n == 0) {
            return 1;
        } else if (n == 1) {
            return 4;
        } else {
            return 2 * f(n - 1) + f(n - 2); // 注意方程式要朝着已知的方向去推断
        }
    }
}

19、题目:不死神兔

案例:不死神兔
用递归实现不死神兔:故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契(Fibonacci)。
在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,
再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,没有发生死亡,
问:现有一对刚出生的兔子2年后(24个月)会有多少对兔子?

package com.study.field.Exer06;

/**
 * ClassName: RabbitExer
 * Package: com.study.field.Exer06
 * Description:
 * 案例:不死神兔
 * 用递归实现不死神兔:故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契(Fibonacci)。
 * 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,
 * 再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,没有发生死亡,
 * 问:现有一对刚出生的兔子2年后(24个月)会有多少对兔子?
 * <p>
 * 推断:
 * 月份         1   2   3   4     5
 * 兔子(对)数    1   1   2   3     5
 * 
 * 可以发现本质就是斐波那契数列!!!
 * 
 * @Author ShiQiFei
 * @Create 2023/6/12 21:21
 * @Version 1.0
 */
public class RabbitExer {
    public static void main(String[] args) {
        RabbitExer rabbit = new RabbitExer();
        int month = 24;
        System.out.println("兔子的对数为:"+rabbit.getRabbitNumber(month));
    }

    public int getRabbitNumber(int month) {
        if (month == 1) {
            return 1;
        } else if (month == 2) {
            return 1;
        }
        return getRabbitNumber(month - 1) + getRabbitNumber(month - 2);
    }

}

拓展:走台阶问题
假如有10阶台阶,小朋友每次只能向上走1阶或者2阶,请问有几种走法?

推断:
阶数 1 2 3 4 ……
走法 1 2 3 5 ……
从n为3开始:
f(n)= f(n-1)+f(n-2)

【奇妙的属性】随着数列的增加,斐波那契数列前一个数与后一个数的比值越来越逼近黄金分割比例0.618。

21、题目:

22、题目:

待更新!!!!!

  • 10
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.史

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值