Day05-数组课后练习2以及参考答案

本文介绍了Java编程中的巩固题和拔高题,包括随机产生并排序偶数、判断回文单词、查找满分学员、查字、找出出现奇数次的数、数组平衡数、左右元素分布、查找个数过半的数字以及计算数组中元素的最短距离等实战练习。
摘要由CSDN通过智能技术生成

巩固题

1、随机产生偶数并排序

案例需求:随机产生10个[1,100]之间的偶数存储到数组中,并按照从小到大排序输出。

开发提示:

  • 随机产生[1,50]范围内的整数 * 2 就能得到[1,100]之间的偶数

参考答案:

public class Homework1 {
    public static void main(String[] args) {
        int[] arr = new int[10];

        //随机产生10个[1,100]的偶数
        for (int i = 0; i < arr.length; i++) {
            /*
            Math.random():[0,1)的小数
            Math.random()*50:[0,50)的小数
            Math.random()*50+1:[1,51)的小数
            (int)(Math.random()*50 + 1):[1,51)的整数,即[1,50]的整数
            (int)(Math.random()*50 + 1) * 2 : [1,100]的偶数
             */
            arr[i] = (int)(Math.random()*50 + 1) * 2;
        }

        //排序
        for (int i = 1; i < arr.length; i++) {
            for(int j=0; j<arr.length - i; j++){
                if(arr[j] > arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }

        //显示结果
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

    }
}

2、判断单词是否是回文单词

案例需求:从键盘输入一个单词,判断它是否是回文单词。

开发提示:

  • 从键盘输入一个单词,存放到一个String类型的变量word中

  • 通过word.toCharArray()可以根据字符串word得到一个char[]类型的数组。

    其中toCharArray()是String类型提供的系统函数,就像Math.random()等函数一样,后面会学到,这里先提前用一下。它的作用就是创建一个char[]数组,并把字符串中的每一个字符依次存储到这个char[]数组中。

Scanner input = new Scanner(System.in);

System.out.print("请输入一个英语单词:");
String word = input.next(); //假如输入的英语单词是mom

char[] wordCharArray = word.toCharArray(); // wordCharArray字符数组内容是{'m','o','m'}
  • 判断数组元素是否首尾对应相等,如果是,那么你输入的单词就是回文单词,否则就不是。

参考答案:

import java.util.Scanner;

public class Homework2 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.print("请输入一个英语单词:");
        String word = input.next(); //假如输入的英语单词是mom

        input.close();

        char[] wordCharArray = word.toCharArray(); // wordCharArray字符数组内容是{'m','o','m'}

        //(1)先假设它是对称的
        boolean flag = true;

        //(2)遍历,查看数组的元素是否首尾对称
        //left表示左边的下标
        //right表示右边的下标
        for(int left=0,right=wordCharArray.length-1; left<right; left++,right--){
            if(wordCharArray[left] != wordCharArray[right]){
                flag = false;
                break;
            }
        }

        if(flag){
            System.out.println(word + "是回文单词");
        }else{
            System.out.println(word + "不是回文单词");
        }

    }
}

3、查找满分学员

案例需求:先从键盘输入本组学员的人数,再从键盘输入本组学员的姓名和成绩,显示学员姓名和成绩。最后查找是否有满分(100)学员,如果有显示姓名,否则显示没有满分学员。

参考答案:

import java.util.Scanner;

public class Homework3 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请录入本组学员人数:");
        int count = input.nextInt();

        int[] grades = new int[count];
        String[] names = new String[count];

        for (int i = 0; i < grades.length; i++) {
            System.out.print("第" + (i+1) + "个学员的姓名:");
            names[i] = input.next();

            System.out.print("第" + (i+1) + "个学员的成绩:");
            grades[i] = input.nextInt();
        }
        input.close();

        //输出学员姓名和成绩
        System.out.println("所有学员的成绩如下:");
        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i] + ":" + grades[i]);
        }

        //查找满分学员
        System.out.println("本班满分学员:");
        boolean flag = false;
        for(int i=0; i<grades.length; i++){
            if(grades[i] == 100){
                System.out.println(names[i]);
                flag = true;
            }
        }
        if(!flag){
            System.out.println("没有");
        }
    }
}

4、查字

案例需求:公司年会有一个寻找锦鲤的游戏,每一个员工随意写一个字,如果在“锦鲤”词库中有这个字,那么就奖励500元锦鲤红包,否则就没有,每人只能玩一次。

现有锦鲤字库如下,它们按照Unicode编码值从小到大排序:

char[] koiFishWords = {'一','今','地','定','尚','年','开','我','果','火','爱','硅','结','花','谷','遍'};

开发提示:

(1)使用顺序查找

(2)使用二分查找:效率更高,因为koiFishWords是有序的数组

参考答案:

import java.util.Scanner;

public class Homework4 {
    public static void main(String[] args) {
        char[] koiFishWords = {'一','今','地','定','尚','年','开','我','果','火','爱','硅','结','花','谷','遍'};

        Scanner input = new Scanner(System.in);

        System.out.print("请输入一个字:");
        char word = input.next().charAt(0);
        input.close();

        int index = -1;
        for(int left = 0,right = koiFishWords.length-1; left<=right; ){
            //int mid = (left+right)/2;
            int mid = left + (right-left)/2;

            if(koiFishWords[mid] == word){
                index = mid;
                break;
            }else if(word > koiFishWords[mid]){
                //说明target在[mid]右边
                left = mid+1;
            }else{
                //说明target<arr[mid],target在[mid]左边
                right= mid-1;
            }
        }
        if(index!=-1){
            System.out.println("你是锦鲤!!!恭喜获得锦鲤红包500元");
        }else{
            System.out.println("o(╥﹏╥)o");
        }
    }
}

5、找出出现奇数次的数

案例需求:已知某个数组中只有1个数字的次数出现奇数次,请找出这个数字。

int[] arr = {2,6,2,5,7,1,2,5,6,1,5,6,1,6,5,7,1};

开发提示:

因为对于任意一个数k,有k ^ k = 0,k ^ 0 = k,所以将arr中所有元素进行异或,那么个数为偶数的元素异或后都变成了0,只留下了个数为奇数的那个元素。

参考答案:

public class Homework5 {
    public static void main(String[] args) {
        int[] arr = {2,6,2,5,7,1,2,5,6,1,5,6,1,6,5,7,1};
        int num = arr[0];
        for (int i = 1; i < arr.length; i++) {
            num ^= arr[i];
        }

        System.out.println("出现奇数次的是:" + num);
    }
}

拔高题

6、找数组平衡数

案例需求:判断数组中是否存在一个值,其左侧的值累加加和等于其右侧的值累加和,如果存在,找出这个值,如果不存在就显示不存在。

例如:[1,2,5,3,2,4,2],结果为:平衡数是3,因为3左边的1,2,5累加和是8,3右边的2,4,2累加和也是8。

​ [9, 6, 8, 8, 7, 6, 9, 5, 2, 5],结果是平衡数不存在。

参考答案:

public class Homework6 {
    public static void main(String[] args) {
        int[] arr = {1,2,5,3,2,4,2};
//        int[] arr = {9, 6, 8, 8, 7, 6, 9, 5, 2, 5};

        boolean flag = false;
        for (int mid = 0; mid < arr.length; mid++) {
            int leftSum = 0;
            int rightSum = 0;
            for (int i = 0; i <mid; i++) {
                leftSum += arr[i];
            }
            for (int i = mid+1; i < arr.length; i++) {
                rightSum += arr[i];
            }
            if(leftSum==rightSum) {
                System.out.println("平衡数是" + mid);
                flag = true;
            }
        }
        if(!flag){
            System.out.println("该数组不存在平衡数");
        }
    }
}

7、左奇右偶

案例需求:现有一个长度为10的整数数组{26,67,49,38,52,66,7,71,56,87}。现在需要对元素重新排列,使得所有的奇数保存到数组左边,所有的偶数保存到数组右边。效果如图所示:

在这里插入图片描述

开发提示:左边的偶数与右边的奇数换位置

  • 定义两个变量left和right,从左边开始查找偶数的位置,找到后用left记录,从右边开始找奇数的位置,找到后用right记录,如果left<right,那么就交换,然后在上一次的基础上继续查找,直到left与right擦肩。

参考答案:

public class Homework7 {
    public static void main(String[] args) {
        int[] arr = {26,67,49,38,52,66,7,71,56,87};

        for (int left = 0,right = arr.length-1; left < right; ){
            //left代表左边需要交换的数的下标,偶数的下标
            //如果arr[left]此时是奇数,说明此时left不是我们要找的下标,left++往后移动
            while(arr[left]%2!=0){//当arr[left]是偶数时,结束while循环
                left++;
            }
            //如果arr[right]此时是偶数,说明此时right不是我们要找的下标,right--往前移动
            while(arr[right]%2==0){//当arr[right]是奇数时,结束while循环
                right--;
            }

            if(left < right){
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right]= temp;
            }
        }

        //输出结果
        System.out.print("数组调整后:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

8、查找数组中个数过半的数字

案例需求:有一个长度为10的整型元素的数组arr,其中有一个元素出现次数超过n / 2,求这个元素。

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

开发提示:

  • 对数组进行排序
  • 取占据数组中间位置的元素,如果某个数字出现的次数过半,那么给数组排序后,这个数字一定会占据数组中间的位置
  • 统计占据数组中间位置的元素实际出现的次数,这样就不用统计每一个数字出现的次数了

参考答案:

public class Homework8 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 2, 2, 2, 5, 4, 2};

        //从小到大排序
        for (int i = 1; i < arr.length; i++) {
            for (int j = 0; j < arr.length - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }

        //取中间元素,因为如果某个数个数过半,那么排序后,这个数一定会占据中间位置
        int mid = arr[arr.length / 2];
        //统计占据数组中间位置的元素出现的次数
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == mid) {
                count++;
            }
        }

        if (count > arr.length / 2) {
            System.out.println("数组中个数过半的是:" + mid + ",共出现了" + count + "次");
        } else {
            System.out.println("数组中不存在个数过半的数字");
        }
    }
}

9、求数组中元素的最短距离

案例需求:随机产生10个[0,100)之间整数存储到数组中,找出数组中的两个元素x和y,使得(x - y)绝对值最小。

开发提示:

  • 将数组进行排序
  • 求相邻元素的差,差值最小值就是最短距离

参考答案:

public class Homework9 {
    public static void main(String[] args) {
        int[] arr = new int[10];

        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int)(Math.random()*100);
        }

        //从小到大排序
        for (int i = 1; i < arr.length; i++) {
            for (int j = 0; j < arr.length - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }

        //显示元素
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();

        int min = Math.abs(arr[1] - arr[0]);
        for (int i = 1; i < arr.length - 1; i++) {
            int dis = Math.abs(arr[i+1] - arr[i]);
            if(dis < min){
                min = dis;
            }
        }
        System.out.println("最短距离是:" + min);
    }
}
  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值