【Java攻城狮宝典】05-数组(答案)

笔试题

参考答案:1.D 2.D 3.C 4.C 5.B 6.C 7.B

机试题

练习1

从控制台读取5个整数,将这5个数升序排序后输出

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] nums = new int[5];
        for (int i = 0; i < 5; i++) {
            System.out.println("请输入数字:");
            nums[i] = scanner.nextInt();
        }
        //冒泡排序
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] < nums[j]) {
                    int temp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = temp;
                }
            }
        }
        //System.out.println(Arrays.toString(nums));//输出
        for (int i = 0; i < nums.length; i++) {//或循环遍历输出
            System.out.println(nums[i]);
        }
    }

练习2

从控制台读取5个整数,将这5个数降序排序后输出

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] nums = new int[5];
        for (int i = 0; i < 5; i++) {
            System.out.println("请输入数字:");
            nums[i] = scanner.nextInt();
        }
        //冒泡排序
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    int temp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = temp;
                }
            }
        }
        //System.out.println(Arrays.toString(nums));//输出
        for (int i = 0; i < nums.length; i++) {//或循环遍历输出
            System.out.println(nums[i]);
        }
    }

练习3

定义一个长度为5的一维数组,数组中元素的值分别为1~5,输出如下结果:

1     2     3     4     5

2     3     4     5     1

3     4     5     1     2

4     5     1     2     3

5     1     2     3     4

    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5};
        for (int i = 0; i < nums.length; i++) {
            for (int j = i; j < nums.length; j++) {
                System.out.print(nums[j] + "\t");
            }
            for (int j = 0; j < i; j++) {
                System.out.print(nums[j] + "\t");
            }
            System.out.println();
        }
    }

练习4

设计一个5x5的数组,使用for循环赋值,结果如下:

1     2     3     4     5

6     7     8     9     10

11   12   13   14   15

16   17   18   19   20

21   22   23   24   25

    public static void main(String[] args) {
        int[][] nums = new int[5][5];
        int n = 1;
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < nums[i].length; j++) {
                nums[i][j] = n;
                n++;
            }
        }
        for (int i = 0; i < nums.length; i++) {//输出
            System.out.println(Arrays.toString(nums[i]));
        }
    }

练习5

设计一个5x5的数组,使用for循环赋值,结果如下:

1     2     3     4     5

10   9     8     7     6

11   12   13   14   15

20   19   18   17   16

21   22   23   24   25

    public static void main(String[] args) {
        int[][] nums = new int[5][5];
        int n = 1;
        for (int i = 0; i < nums.length; i++) {
            if (i % 2 == 0) {
                for (int j = 0; j < nums[i].length; j++) {
                    nums[i][j] = n;
                    n++;
                }
            } else {
                for (int j = nums[i].length - 1; j >= 0; j--) {
                    nums[i][j] = n;
                    n++;
                }
            }
        }
        for (int i = 0; i < nums.length; i++) {//输出
            System.out.println(Arrays.toString(nums[i]));
        }
    }

练习6

设计一个5x5的数组,使用for循环赋值,结果如下:

1     6     11   16   21

2     7     12   17   22

3     8     13   18   23

4     9     14   19   24

5     10   15   20   25

    public static void main(String[] args) {
        int[][] nums = new int[5][5];
        int n = 1;
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < nums[i].length; j++) {
                nums[j][i] = n;
                n++;
            }
        }
        for (int i = 0; i < nums.length; i++) {//输出
            System.out.println(Arrays.toString(nums[i]));
        }
    }

练习7

设计一个5x5的数组,使用for循环赋值,结果如下:

1     10   11   20   21

2     9     12   19   22

3     8     13   18   23

4     7     14   17   24

5     6     15   16   25

    public static void main(String[] args) {
        int[][] nums = new int[5][5];
        int n = 1;
        for (int i = 0; i < nums.length; i++) {
            if (i % 2 == 0) {
                for (int j = 0; j < nums[i].length; j++) {
                    nums[j][i] = n;
                    n++;
                }
            } else {
                for (int j = nums[i].length - 1; j >= 0; j--) {
                    nums[j][i] = n;
                    n++;
                }
            }
        }
        for (int i = 0; i < nums.length; i++) {//输出
            System.out.println(Arrays.toString(nums[i]));
        }
    }

练习8

创建一个n*n的数组,完成如下赋值,称作回型矩阵。

1     2     3     4     5

16   17   18   19   6

15   24   25   20   7

14   23   22   21   8

13   12   11   10   9

 

解题思路

    public static void main(String[] args) {
        int len = 5;//行列数
        int[][] nums = new int[len][len];
        int n = 1;
        int circle = 1;//第几圈
        while (n < len * len) {
            //右
            for (int i = circle - 1; i < len - circle; i++) {
                nums[circle - 1][i] = n++;
            }
            //下
            for (int i = circle - 1; i < len - circle; i++) {
                nums[i][len - circle] = n++;
            }
            //左
            for (int i = len - circle; i >= circle; i--) {
                nums[len - circle][i] = n++;
            }
            //上
            for (int i = len - circle; i >= circle; i--) {
                nums[i][circle - 1] = n++;
            }
            circle++;
        }
        if (len % 2 == 1) {//奇数的时候中间那个需要单独设置
            nums[len / 2][len / 2] = len * len;
        }
        for (int i = 0; i < nums.length; i++) {//输出
            System.out.println(Arrays.toString(nums[i]));
        }
    }

练习9

有一个正整数数组,存在重复元素,非降序排列。要求将数组元素打印到屏幕上,请手写程序,并满足一下条件:

  1. 按升序输出数组元素
  2. 重复元素仅打印一次
  3. 时间复杂度O(n)

示例:原始数据[2,3,3,6,6,9,10,10,10,16,18],依次在屏幕上打印 2,3,6,9,10,16,18

    public static void main(String[] args) {
        int[] nums = {2, 3, 3, 6, 6, 9, 10, 10, 10, 16, 18};
        System.out.println(nums[0]);
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] != nums[i - 1]) {//相邻的两个数不相等
                System.out.println(nums[i]);
            }
        }
    }

练习10

有一个数组中有100个数字,请输出:没有重复并按照升序排序的数字

    public static void main(String[] args) {
        int[] nums = {5, 86, 68, 24, 73, 85, 44, 91, 44, 83, 96, 32, 77, 1, 2,
                32, 6, 95, 13, 94, 35, 63, 26, 54, 32, 52, 9, 51, 79, 31, 36,
                76, 16, 13, 34, 72, 86, 47, 54, 52, 83, 59, 75, 13, 13, 68, 68,
                51, 27, 86, 73, 12, 91, 75, 32, 54, 37, 34, 18, 65, 46, 6, 19,
                33, 96, 19, 57, 9, 61, 74, 69, 8, 79, 39, 40, 1, 39, 69, 56, 58,
                35, 13, 84, 13, 74, 3, 98, 52, 55, 29, 24, 67, 29, 10, 66, 72, 5, 48, 37, 67};
        for (int i = 0; i < nums.length; i++) {//冒泡排序
            for (int j = 0; j < nums.length - i - 1; j++) {
                if (nums[j] > nums[j + 1]) {
                    int temp = nums[j + 1];
                    nums[j + 1] = nums[j];
                    nums[j] = temp;
                }
            }
        }
        System.out.println(nums[0]);
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] != nums[i - 1]) {//相邻的两个数不相等
                System.out.println(nums[i]);
            }
        }
    }

练习11

给出给出随机的100个数,序号为1-100,按从小到大顺序输出,并输出相应的序号(在原数组中的位置)

    public static void main(String[] args) {
        int[] nums = {5, 86, 68, 24, 73, 85, 44, 91, 44, 83, 96, 32, 77, 1, 2,
                32, 6, 95, 13, 94, 35, 63, 26, 54, 32, 52, 9, 51, 79, 31, 36,
                76, 16, 13, 34, 72, 86, 47, 54, 52, 83, 59, 75, 13, 13, 68, 68,
                51, 27, 86, 73, 12, 91, 75, 32, 54, 37, 34, 18, 65, 46, 6, 19,
                33, 96, 19, 57, 9, 61, 74, 69, 8, 79, 39, 40, 1, 39, 69, 56, 58,
                35, 13, 84, 13, 74, 3, 98, 52, 55, 29, 24, 67, 29, 10, 66, 72, 5, 48, 37, 67};
        int[] orders = new int[nums.length];//写一个数组,记录编号从1~100,与原来的数组对应
        for (int i = 0; i < nums.length; i++) {
            orders[i] = i + 1;
        }
        for (int i = 0; i < nums.length; i++) {
            for (int j = 0; j < nums.length - i - 1; j++) {
                if (nums[j] > nums[j + 1]) {
                    int temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                    temp = orders[j];
                    orders[j] = orders[j + 1];
                    orders[j + 1] = temp;
                }
            }
        }
        for (int i = 0; i < nums.length; i++) {
            System.out.println(nums[i] + "序号" + orders[i]);
        }

    }

练习12

给定一整数序列A1,A2,…An(可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大,并输出子序列的内容

    //暴力破解法
    int[] nums = {1, 2, -1, 6};
    int step = 1;//几个元素相加		
    int start = 0;//开始索引
    int end = 0;//结尾索引
    int maxSum = nums[0];//第一次的序列只有一个数,假设当前第一个最大
    while (step <= nums.length) {
        for (int i = 0; i <= nums.length - step; i++) {
            int tempSum = nums[i];
            for (int j = i + 1; j < i + step; j++) {
                tempSum += nums[j];
            }
            if (tempSum >= maxSum) {//和相同则要最长子序列
                start = i;
                end = i + step - 1;
                maxSum = tempSum;
            }
        }
        step++;
    }
    System.out.println(maxSum + ";start=" + start + ",end=" + end);

    //动态规划法
    int[] nums = {-1, -2, -1, 6,1,-10};
    int max = nums[0];
    //以第n个元素结尾的子序列
    int[] sums = new int[nums.length];
    sums[0] = nums[0];
    //以第i个元素结尾的子序列和
    int[] starts = new int[nums.length];
    int end = 0;
    for (int i = 1; i < nums.length; i++) {
        if (sums[i - 1] > 0) {//它前面的子序列大于0
            sums[i] = sums[i - 1] + nums[i];
            starts[i] = starts[i - 1];
        } else {
            sums[i] = nums[i];
            starts[i] = i;
        }
        if (sums[i] > max) {
            max = sums[i];
            end = i;
        }
    }
    System.out.println(max);
    System.out.println(starts[end] + "," + end);


练习13

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变

    public static void main(String[] args) {
        int[] nums = {1, 4, 3, 6, 7, 8, 9, 2, 3, 5, 6, 3, 0, 1};
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] % 2 == 0) {//偶数a
                for (int j = i + 1; j < nums.length; j++) {//从它后面开始找奇数
                    if (nums[j] % 2 == 1) {//找到它后面第一个奇数b
                        int temp = nums[j];//记住这个奇数b,这个奇数b要放到前面去
                        for (; j > i; j--) {//奇数b前面的数依次向后移动
                            nums[j] = nums[j - 1];
                        }
                        nums[i] = temp;//把奇数b放到原来偶数a那个位置
                        System.out.println(Arrays.toString(nums));
                        break;
                    }
                }
            }
        }
        System.out.println(Arrays.toString(nums));
    }

练习14

有一个长度为11的array,存储1-10的数字,只有一个是重复的,请写程序找出这个数字

    public static void main(String[] args) {
        int num[] = {9, 4, 3, 8, 3, 1, 7, 5, 6, 10, 2};
        int[] sort = new int[10];
        for (int i : num) {//桶排序的思想 位置0存1,位置1存2。。位置i-1存i
            if (sort[i - 1] == i) {//如果这个位置已经有数字了,代表之前放过数
                System.out.println(i + "是重复的");
            } else {
                sort[i - 1] = i;
            }
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实验七 Java多线程 一、实验目的: 熟悉利用Thread类建立多线程方法。 熟悉利用Thread接口建立多线程方法。 二、实验内容: 1. 阅读下列程序,分析并上机检验其功能。 class DelayThread exends Thread{ private static int count=0; private int no; private int delay; public DelayThread(){ count++; no=count; } public void run(){ try{ for (int i=0;i<10;i++){ delay=(int)(Math.random()*5000); sleep(delay); System.out.println(“Thread ”+no+” with a delay ”+delay); } }catch(InterruptedException e){}}} public class MyThread{ public static void main(String args[]){ DelayThread thread1=new DelayThread(); DelayThread thread2=new DelayThread(); thread1.start(); thread2.start(); try{ Thread.sleep(1000);}catch(InterruptedException e){ System.out.println(“Thread wrong”);}}} 2.讲上列程序利用Runnable接口改写,并上机检验。 3.利用多线程编写一个模拟时钟(AWT程序、Runnable接口),有时/分/秒针 编写一个应用程序,创建三个线程分别显示各自的时间。 三、实验要求: 1. 通过实验掌握Thread 、Runnable使用方法; 2. 程序必须能够实现多线程; 3. 程序必须能够完成题目要求; 4. 写出实验报告。 四、实验步骤: 首先分析程序功能,再通过上机运行验证自己的分析,从而掌握通过Thread类建立多线程的方法。 通过将扩展Thread类建立多线程的方法改为利用Runnable接口的方法,掌握通过Runnable接口建立多线程的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

专治八阿哥的孟老师

您的鼓励是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值