Java课后练习2--day05

巩固题

1、随机产生偶数并排序

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

开发提示:

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

参考答案:

import java.util.Arrays;

public class Homework1 {
    public static void main(String[] args) {

        //定义一个数组存储随机10个[1,100]的偶数
        int[] arr=new int[10];
        for (int i = 0; i < 10; i++) {
            int num = (int)(Math.random()*50)+1;
            arr[i]=num*2;
        }
       
        //利用冒泡排序按照从小到达排序输出
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length-i-1; j++) {
                if(arr[j]>arr[j+1]){
                    int x=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=x;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

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 scanner = new Scanner(System.in);
        System.out.println("请输入一个英文单词:");
        String word = scanner.next();
        char[] words = word.toCharArray();

        boolean palindrome = false;
        for (int i = 0; i < words.length; i++) {
               //定义一个布尔型变量palindrome来判断是不是回文单词,默认为false
            if (words[i] != words[words.length - i - 1]) {
                palindrome=true;
                break;
            }
        }
        if(!palindrome){
            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 scanner = new Scanner(System.in);
        System.out.println("请输入本组学员的人数:");
        int people = scanner.nextInt();
        String[] name = new String[people];
        int[] grade = new int[people];

        //输入学员姓名和成绩
        for (int i = 0; i < people; i++) {
            System.out.println("请输入第" + (i + 1) + "个学生的姓名:");
            name[i] = scanner.next();
            System.out.println("请输入第" + (i + 1) + "个学生的成绩:");
            grade[i] = scanner.nextInt();
        }

        //显示学员姓名和成绩
        for (int i = 0; i < name.length; i++) {
            System.out.print(name[i] + "    \t");
        }
        System.out.println();
        for (int i = 0; i < grade.length; i++) {
            System.out.print(grade[i] + "    \t");
        }
        System.out.println();

        int count=0;
        for (int i = 0; i < grade.length; i++) {
            if(grade[i]==100){
                System.out.println(name[i] + "是满分");
                count++;
            }
        }
        if(count==0){
            System.out.println("没有满分学员");
        }
    }
}

4、查字

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

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

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

开发提示:

(1)使用顺序查找

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

参考答案:

import java.util.Scanner;

public class Homework4 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        char[] koiFishWords = {'一', '今', '地', '定', '尚', '年', '开', '我', '果', '火', '爱', '硅', '结', '花', '谷', '遍'};
        System.out.println("请输入员工写的一个字:");
        char word = scanner.next().charAt(0);
        scanner.close();

        //方法1:顺序查找
        boolean flag = false;
        for (int i = 0; i < koiFishWords.length; i++) {
            if (koiFishWords[i] == word) {
                flag = true;
                break;
            }
        }
        if (flag) {
            System.out.println("恭喜你中奖了,获得500元锦鲤红包");
        } else {
            System.out.println("抱歉,你没有中奖");
        }

        //方法2:二分查找
        int start=0,end=koiFishWords.length-1,index=-1,middle;
        while(start<=end){
            middle=(start+end)>>1;
            if(word>koiFishWords[middle]){
                start=middle+1;
            }else if (word<koiFishWords[middle]){
                end =middle-1;
            }else {
                index=middle;
                break;
            }
        }
        if(index!=-1){
            System.out.println("恭喜你中奖了,获得500元锦鲤红包");
        }else {
            System.out.println("抱歉,你没有中奖");
        }
    }
}

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 Homwork5 {
    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};

        //方法1:定义一个变量counts来记录从0-9的数字出现的次数
        int[] counts = new int[10];
        for (int i = 0; i < arr.length; i++) {
            int x = arr[i];
            counts[x]++;
        }
        for (int i = 0; i < counts.length; i++) {
            if (counts[i] % 2 != 0) {
                System.out.println("数组中出现奇数次的数字为:" + i);
            }
        }

        //方法2:将arr中所有元素进行异或,然后最后留下的数为奇数的元素,
        //注意:仅适用于单个奇数次的出现,如果存在两个奇数次的则不适用
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum ^= arr[i];
        }
        System.out.println("数组中出现奇数次的数字为:" + sum);
    }
}

拔高题

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 = {9, 6, 8, 8, 7, 6, 9, 5, 2, 5};

        //定义两个变量left,right来存储值的左右和

        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            int left = 0, right = 0;
            //求左边和
            for (int j = 0; j < i; j++) {
                left += arr[j];
            }

            //求右边的和
            for (int j = i + 1; j < arr.length; j++) {
                right += arr[j];
            }
            if (left == right) {
                System.out.println("平衡数存在为:" + i);
                count++;
                break;
            }
        }
        if(count==0){
            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};

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

        int left = 0, right = arr.length - 1;
        while (left < right) {
            while (arr[left] % 2 != 0) {
                left++;
            }
            while (arr[right] % 2 == 0) {
                right--;
            }
            if(left<right){
                int x=arr[left];
                arr[left]=arr[right];
                arr[right]=x;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

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

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

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

开发提示:

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

参考答案:

import java.util.Arrays;

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

        //冒泡排序将数组arr的数字从小到大进行排序
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[i] > arr[i + 1]) {
                    int x = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = x;
                }
            }
        }
        System.out.println(Arrays.toString(arr));

        //定义一个变量middlenum来记录这个数组中间的数字
        int middlenum = arr[arr.length / 2];
        //定义一个变量count来记录数组中间的数字在数组中出现的次数
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == middlenum) {
                count++;
            }
        }
        
        if (count > arr.length / 2) {
            System.out.println(middlenum + "是数组个数过半的数字");
        } else {
            System.out.println("该数组没有个数过半的数字");
        }
    }
}

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

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

开发提示:

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

参考答案:

import java.util.Arrays;

public class Homework9 {
    public static void main(String[] args) {
        int[] arr = new int[10];
        for (int i = 0; i < 10; i++) {
            arr[i] = (int) (Math.random() * 100) + 1;
        }
        System.out.println(Arrays.toString(arr));
        //冒泡排序将arr数组从小到大进行排序
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int x = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = x;
                }
            }
        }
        System.out.println(Arrays.toString(arr));

        //定义一个变量min来存储arr[i+1]-arr[i]的数,初始值为min=arr[1]-arr[0]
        int minnum=arr[1]-arr[0];
        int minIndex=0;
        for (int i = 0; i < arr.length-1; i++) {
            if(minnum>arr[i+1]-arr[i]){
                minnum=arr[i+1]-arr[i];
                minIndex=i;
            }
        }
        System.out.println("差值最小的是第" + (minIndex+1) + "和第" + (minIndex + 2) + "个,他们的差值是:" + minnum);
    }
}

tring(arr));

    //定义一个变量min来存储arr[i+1]-arr[i]的数,初始值为min=arr[1]-arr[0]
    int minnum=arr[1]-arr[0];
    int minIndex=0;
    for (int i = 0; i < arr.length-1; i++) {
        if(minnum>arr[i+1]-arr[i]){
            minnum=arr[i+1]-arr[i];
            minIndex=i;
        }
    }
    System.out.println("差值最小的是第" + (minIndex+1) + "和第" + (minIndex + 2) + "个,他们的差值是:" + minnum);
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值