算法通关:005对数器

就是你有优解,但是不知道对不对,或者你遇到了题,但是没有在线网站能跑,无法检查你的思路是否正确。


写一个随机生成符合输入要求的方法。
此时用暴力解法写一个,因为答案肯定是对的,再写一个优解方法。将两个答案进行对比。
经过很多轮这样的对比,就能确定优解思路正确。

public class _005 {

    //对数器
    public static void main(String[] args) {
        //N 是数组几位数的范围
        int N = 10;
        int max = 500;
        int testTimes = 100;//进行多少次测试
        System.out.println("测试开始!!");

        for (int i = 0; i < testTimes; i++) {
            System.out.println("这是第" + (i+1) + "次测试");
            //在这里使用N 随机产生数组多少位
            int n = (int) (Math.random() * N) + 1;
            int[] arr = randomArray(n, max);
            int[] arr1 = copy(arr);
            int[] arr2 = copy(arr);
            int[] arr3 = copy(arr);

          /*  sout(arr);
            sout(arr1);
            sout(arr2);
            sout(arr3);
            System.out.println("~~~~~~~排序后~~~~~~~~");*/
                selectSort(arr1);
                popSort(arr2);
                insertSort(arr3);

         /*   sout(arr1);
            sout(arr2);
            sout(arr3);*/

            /*  编程习惯:在很多情况下,程序员习惯于使用!=来检查不等的情况,因为这样可以更快地发现问题并作出反应(即数组不相同的情况),
                    这是一种常见的编程实践。
                避免错误:如果使用==,可能会在逻辑上产生误导,特别是在复杂的条件判断中,容易让人误解比较的意图。
                    使用!=则直接表明了比较的目的,即寻找数组中的不同之处。
                 */
            //此时就要注意 && 和 || 的使用
           if (!sameArray(arr1, arr2) && !sameArray(arr3, arr1) ) {
               System.out.println("出错了!");
           }
            System.out.println("测试通过!!!");
        }

        System.out.println("测试结束");
    }

    //输出数组
    public static void sout(int[] arr){
        for(int i : arr){
            System.out.print(i);
        }
        System.out.println();

    }


    //随机产生一个数组
    //利用random
    public static int[] randomArray(int n, int max) {
        //n 是这个数组有几个数字,max 是这个数组的最大值
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = (int) (Math.random() * max) + 1;
        }
        return arr;
    }


    //复制数组
    public static int[] copy(int[] arr) {
        int[] copy_arr = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            copy_arr[i] = arr[i];
        }
        return copy_arr;
    }

    //交换
    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    //插入排序 拿牌
    public static void insertSort(int[] arr){
        if(arr == null || arr.length == 1){
            return;
        }

        for(int i = 0; i < arr.length; i++){
            for(int j = i-1;j >= 0 && arr[j] > arr[j+1];j--){
                swap(arr, j, j+1);
            }
        }
    }


    //选择排序
    public static void selectSort(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }

        for (int i = 0; i < arr.length; i++) {
            for (int end = arr.length - 1; end > i; end--) {
                if (arr[end] < arr[i]) {
                    swap(arr, i, end);
                }
            }
        }
    }

    //冒泡排序

    public static void popSort(int[] arr) {
        if(arr == null || arr.length == 1){
            return;
        }
        for (int end = arr.length - 1; end > 0; end--) {
            for (int i = 0; i < end; i++) {
                if (arr[i] > arr[i + 1]) {
                    swap(arr, i, i + 1);
                }
            }
        }
    }


    //查看两个数组是否相同
    public static  boolean sameArray(int[] arr1,int[] arr2){
        int n = arr1.length;
        for(int i = 0;i < n ;i++){
            if(arr1[i] != arr2[i]){
                return false;
            }
        }
        return true;
    }
    /*          编程习惯:在很多情况下,程序员习惯于使用!=来检查不等的情况,因为这样可以更快地发现问题并作出反应(即数组不相同的情况),
                    这是一种常见的编程实践。
                避免错误:如果使用==,可能会在逻辑上产生误导,特别是在复杂的条件判断中,容易让人误解比较的意图。
                    使用!=则直接表明了比较的目的,即寻找数组中的不同之处。
                 */
}

在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值