Day06Java基础-数组的七个典型案例(逢7跳过, ..., 评委打分, 随机产生验证码)

案例一: 逢 7 跳过

package com.itheima.test;

public class Test1 {

    public static void main(String[] args) {
        knockSeven();
    }

    /*
        需求: 在控制台打印出 1~100 之间满足逢七过规则的数据

        分析:
                1. 通过循环获取到1~100之间的每一个数字
                2. 数值拆分, 拆分出个位和十位
                3. 根据规则加入if判断
                        if(ge == 7 || shi == 7 || i % 7 == 0)
                4. 打印出满意规则的数据
     */
    public static void knockSeven(){
        // 1. 通过循环获取到1~100之间的每一个数字
        for(int i = 1; i <= 100; i++){
            // 2. 数值拆分, 拆分出个位和十位
            int ge = i % 10;
            int shi = i / 10 % 10;
            // 3. 根据规则加入if判断
            if(ge == 7 || shi == 7 || i % 7 == 0){
                System.out.println("过");
            }else{
                // 4. 打印出满意规则的数据
                System.out.println(i);
            }
        }
    }
}

案例二: 数组元素求和

package com.itheima.test;

public class Test2 {
    public static void main(String[] args) {
        int[] arr = new int[]{68, 27, 95, 88, 171, 996, 51, 210};

        int evenNumberSum = getEvenNumberSum(arr);
        System.out.println(evenNumberSum);
    }

    private static int getEvenNumberSum(int[] arr) {
        // 1. 定义求和变量
        int sum = 0;
        // 2. 遍历数组中的每一个元素
        for (int i = 0; i < arr.length; i++) {
            int ge = arr[i] % 10;
            int shi = arr[i] / 10 % 10;
            // 3. 判断
            if (ge != 7 && shi != 7 && arr[i] % 2 == 0) {
                sum += arr[i];
            }
        }
        // 4. 返回结果
        return sum;
    }

    /*
            需求 :
                    有这样的一个数组, 元素是 {68,27,95,88,171,996,51,210}
                    求出该数组中满足要求的元素和
                    要求是: 求和的元素个位和十位都不能是7, 并且只能是偶数
     */
}

案例三: 判断两个元素是否相同

package com.itheima.test;

public class Test3 {
    /*
        == :
                1. 基本数据类型 : 比较数据值
                2. 引用数据类型 : 比较地址值
     */
    public static void main(String[] args) {
        int[] arr1 = {11, 22, 33};
        int[] arr2 = {11, 22, 33, 55};

        boolean result = checkArrayContent(arr1, arr2);
        System.out.println(result);
    }

    /*
         需求: 定义一个方法, 比较两个数组的内容是否相同
         要求: 长度, 内容, 顺序完全相同
     */
    public static boolean checkArrayContent(int[] arr1, int[] arr2) {
        // 1. 检查两个数组的长度是否相同
        if (arr1.length != arr2.length) {
            return false;
        }

        // 2. 检查两个数组内容是否相同
        for (int i = 0; i < arr1.length; i++) {
            if (arr1[i] != arr2[i]) {
                return false;
            }
        }

        // 3. 到达这一步说明两个数组长度, 内容, 顺序完全相同
        return true;
    }
}

案例四: 查看元素在数组中的索引

(1) 从数组中找索引

package com.itheima.test;

import java.util.Scanner;

public class Test4_1 {
    public static void main(String[] args) {
        int[] arr = {19, 28, 37, 46, 59};

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您要查找的元素:");
        int num = sc.nextInt();

        int index = getIndex(num, arr);

        System.out.println(index);
    }
    /*
        需求:
            设计一个方法, 查找元素在数组中的索引位置

            已知一个数组 arr = {19, 28, 37, 46, 59}
            键盘录入一个数据, 查找该数据在数组中的索引.
            并在控制台输出找到的索引值
            如果没有查找到, 则输出-1
     */
    public static int getIndex(int num, int[]arr){
        // 1. 假设要查找的元素, 在数组中是不存在的
        int index = -1;
        // 2. 遍历数组,获取内部的每一个元素
        for (int i = 0; i < arr.length; i++) {
            // 3. 比较
            if(arr[i] == num){
                // 4. 找到后, 让index变量记录正确的索引位置
                index = i;
                break;
            }
        }
        return index;
    }
}

(2) 考虑(1)重复元素问题做出修改

package com.itheima.test;

import java.util.Scanner;

public class Test4_2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] arr = {19, 28, 37, 46, 50, 19, 19};
                  //  0   1   2   3   4   5   6
        System.out.println("请输入一个数组中的元素");
        int num = sc.nextInt();
        int[] result = getIndex(num, arr);
        System.out.println("对应的索引为:");
        for (int i = 0; i < result.length; i++) {
            System.out.print(result[i] + " ");
        }
    }

    /*
        需求: 设计一个方法, 查找元素在数组中的索引位置 (考虑重复元素问题)
        注意: return只能返回一个结果

        问题: 当一个方法运行结束后, 有多个结果需要返回, 怎么处理?
        回答: 可以将多个结果, 存入一个数组容器, 将数组返回.
     */
    public static int[] getIndex(int num, int[] arr) {
        // 1. 统计要查找的元素, 在数组中出现的个数
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == num) {
                count++;
            }
        }
        // 2. 根据统计出来的个数, 创建数组容器
        int[] result = new int[count];
        int index = 0;

        // 3. 查找元素在数组中的索引, 将找到的索引, 存入数组容器
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == num) {
                result[index] = i;
                index++;
            }
        }
        return result;
    }
}

案例五: 数组元素反转

  • 演示1:

package com.itheima.Demo;

public class SwapDemo1 {
    /*
        思路: 今后只要涉及到数据交换, 联想到第三方的变量

                int a = 10;
                int b = 20;

                int c = a;
                a = b;
                b = c;

                System.out.println("a=" + a);   // 20
                System.out.println("b=" + b);   // 10

        面试题: 实现两个变量的数据交换, 不允许定义第三方变量
     */

    /*
        ^ 异或 :

                特点:
                        1. 相同为false, 不同为true
                        2. 一个数字, 被另外一个数字异或两次, 该数本身不变

        异或操作数值的运算过程 :

            1. 将需要运算的数据, 转换为二进制数据

                    0000 1010       10
                    0000 0101       5

            2. 将二进制数据的0当做为false, 1当做为true, 运算

                     0000 1010
               ^     0000 0101
             --------------------
                     0000 1111

            3. 将运算后的二进制数据, 转换为十进制
     */
    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        a = a ^ b;      // a = 10 ^ 20
        b = a ^ b;      // b = 10 ^ 20 ^ 20     b = 10
        a = a ^ b;      // a = 10 ^ 20 ^ 10     a = 20

        System.out.println("a=" + a);   // 20
        System.out.println("b=" + b);   // 10
    }
}
  • 演示2:

package com.itheima.Demo;

public class SwapDemo2 {
    public static void main(String[] args) {
        int[] arr = {11, 22, 33, 44, 55};

        // 数组中的第一个元素, 和最后一个元素进行交换
        // 1. 确定后, 谁和谁交换    arr[0]  arr[4]
        // 2. 定义第三方变量, 倒手
        int temp = arr[0];
        arr[0] = arr[4];
        arr[4] = temp;

        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}
  • 测试

package com.itheima.test;

public class Test5 {
    /*
        已知一个数组 arr = {11, 22, 33, 44, 55}; 用程序实现把数组中的元素值交换,
        交换后的数组 arr = {55, 44, 33, 22, 11}; 并在控制台输出交换后的数组元素.

        1. 确定好谁跟谁换

                第一个和倒数第一个 : arr[0]  arr[arr.length-1-0]
                第二个和倒数第二个 : arr[1]  arr[arr.length-1-1]
                第三个和倒数第三个 : arr[2]  arr[arr.length-1-2]
                ...

                arr[i]  arr[arr.length-1-i]

         2. 定义三方变量, 套入公式
     */
    public static void main(String[] args) {
        int[] arr = {11, 22, 33, 44, 55};

//        reverseArray1(arr);

        reverseArray2(arr);

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

    private static void reverseArray2(int[] arr) {
        for (int start = 0, end = arr.length - 1; start < end; start++, end--) {
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
        }
    }

    private static void reverseArray1(int[] arr) {
        for (int i = 0; i < arr.length / 2; i++) {
            int temp = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = temp;
        }
    }
}

案例六: 评委打分

package com.itheima.test;

import java.util.Scanner;

public class Test6 {
    /*
        需求:
                在编程竞赛中, 有6个评委为参赛的选手打分, 分数为0-100的整数分.
                选手的最后得分为: 去掉一个最高分和一个最低分后的四个评委平均值

                1. 基本实现 (不考虑分数校验)
                2. 校验键盘录入的分数是否是0~100之间
                3. 抽取方法
     */
    public static void main(String[] args) {

        int[] arr = initData();

        int sum = getSum(arr);

        int max = getMax(arr);

        int min = getMin(arr);

        printAvg(arr, sum, max, min);
    }

    /**
     * 数组中求平均值并打印*/
    private static void printAvg(int[] arr, int sum, int max, int min) {
        // 5. 求平均分 (总和 - 最大值 - 最小值) / 4
        double avg = (sum - max - min) * 1.0 / (arr.length - 2);

        System.out.println("选手最后的得分为:" + avg);
    }

    /**
     * 数组中找最小值*/
    private static int getMin(int[] arr) {
        // 4. 求最小值
        int min = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < min) {
                min = arr[i];
            }
        }
        return min;
    }

    /**
     * 数组中找最大值*/
    private static int getMax(int[] arr) {
        // 3. 求最大值
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }

    /**
     *数组求和 */
    private static int getSum(int[] arr) {
        // 2. 求和
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }

    /**
     * 此方法用于键盘录入6个评委的分数
     * */
    private static int[] initData() {
        int[] arr = new int[6];

        // 1. 键盘录入6个评委的打分
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入6个评委的评分:");

        for (int i = 0; i < arr.length; i++) {
            System.out.println("请输入第" + (i + 1) + "位评委的打分");
            int score = sc.nextInt();
            if (score >= 0 && score <= 100) {
                arr[i] = score;
            } else {
                System.out.println("您的分数输入有误, 请检查该分数是否处于0~100之间!");
                i--;
            }

        }
        return arr;
    }
}

案例七: 随机产生验证码

package com.itheima.test;

import java.util.Random;
import java.util.Scanner;

public class Test7 {
    /*
        需求: 请从26个英文字母 (大小写都包含) , 以及数字0-9中, 随机产生一个5位的字符串验证码并打印在控制台
        效果: uYq8I, 3r4Zj

        注意事项: 打印字符类型数组名, 不会看到地址值, 而是元素的内容
     */
    public static void main(String[] args) {

        char[] chs = getContents();

        String checkCode = getCheckCode(chs);

        System.out.println("产生的验证码为:" + checkCode);

    }

    private static String getCheckCode(char[] chs) {
        Random r = new Random();

        String checkCode = "";

        for (int i = 1; i<=5; i++){
            int randomIndex = r.nextInt(chs.length);
            checkCode += chs[randomIndex];
        }
        return checkCode;
    }

    private static char[] getContents() {
        char[] chs = new char[26 + 26 + 10];

        int index = 0;

        for (char c = 'a'; c <= 'z'; c++){
            chs[index] = c;
            index++;
        }

        for (char c = 'A'; c <= 'Z'; c++){
            chs[index] = c;
            index++;
        }

        for (char c = '0'; c <= '9'; c++){
            chs[index] = c;
            index++;
        }
        return chs;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码里码理~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值