Java刷题-基础篇

发布于:2024-05-23 ⋅ 阅读:(126) ⋅ 点赞:(0)

目录

题目1:改变原有数组元素的值

题目2:奇数位于偶数之前

题目3:两数之和

题目4:只出现一次的数字

题目5:多数元素

题目6:存在连续三个奇数的数组


题目1:改变原有数组元素的值

题目详细说明:实现一个方法 transform, 以数组为参数, 循环将数组中的每个元素乘以 2 , 并设置到对应的数组元素上,例如 原数组为 {1, 2, 3}, 修改之后为 {2, 4, 6}。

思路:在main方法中定义一个数组,将该以参数的方式传递给transform方法,在transform方法中用循环的方式遍历数组中的每个元素,并将其元素的值*=2,使得每个元素的值变为原来的二倍;transform方法并不需要返回值,因为,数组传参传递的是地址(虽然Java中没有地址的概念,但我觉得这样好理解)。

    public static void transform(int[] array) {
        for (int i = 0; i < array.length; i++) {
            array[i] *= 2;
        }
    }

    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        transform(array);
        System.out.println(Arrays.toString(array));[2,4,6,8,10]
    }

题目2:奇数位于偶数之前

题目详细说明:调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。如数组:[1,2,3,4,5,6],调整后可能是:[1, 5, 3, 4, 2, 6]。

思路:这道题与翻转数组很类似,本质都是将数组中的两个元素的值做互换。因此我们可以先定义left、right整型变量表示左、右元素的下标,但我们并不能像翻转数组一样直接让left、right下标对应的元素直接做互换,因为本题的要求是将所有奇数放在偶数前,如果left、right下标对应的元素都是偶数或奇数,或left下标对应元素是奇数,right下标对应元素是偶数这三种情况是不用互换的,只有当left下标对应元素是偶数,right下标对应元素是奇数才互换,因此在互换元素前要先判断left、right下标对应元素是否符合互换的条件,不符合时left++或right--。不过在写条件时,我们要考虑到一种特殊情况的存在,当我们定义的数组所有的元素都是奇数,那么在互换元素前判断left下标对应元素是否符合互换的条件时,它总是不符合的,这样left一直++,会导致越界访问,因此在互换元素前判断left、right下标对应元素是否符合互换的条件时要在条件中加上left<right,防止越界。

    public static void func(int[] array) {
        int left = 0;
        int right = array.length - 1;
        while (left < right) {
            if (left < right && array[left] % 2 != 0) {
                left++;
            }
            if (left < right && array[right] % 2 == 0) {
                right--;
            }
            int cur = array[left];
            array[left] = array[right];
            array[right] = cur;
        }
    }
    
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6};
        func(array);
        System.out.println(Arrays.toString(array));//[1,5,3,4,2,6]
    }

题目3:两数之和

题目详细说明:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两整数,并返回它们在数组中的下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9 

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 

思路:方法是不能返回两个值的,因此我们可以定义一个数组,将要返回的值用装入数组中,最后让数组返回即可(注意这种做法在C语言中是不允许的,在Java中可以是因为对象所开辟的空间在堆中,只要堆中的数据仍在被利用,那么对应的内存空间就不会被销毁)。以上面示例1为具体分析对象,一个数组中每两个元素的和的情况可以是加号左边是2,右边可以是7、11、15;加号左边是7,右边可以是11、15;加号左边是11,右边可以是15。我们可以定义变量i、j分别代表加号左右两边的操作数在数组中的下标,采用循环嵌套的方式,外层循环控制加号左边的操作数,内层循环控制加号右边的操作数,如果两个操作数之和==target,就将i和j分别存入预先开辟好的数组中,最后返回数组即可。

    public static int[] func(int[] array, int target) {
        int[] cur = {-1, -1};
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = i + 1; j < array.length; j++) {
                if (array[i] + array[j] == target) {
                    cur[0] = i;
                    cur[1] = j;
                    return cur;
                }
            }
        }
        return cur;
    }
    
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int target = scan.nextInt();
        int[] array = {2, 7, 11, 15};
        int[] cur = func(array, target);
        System.out.println(Arrays.toString(cur));
    }

题目4:只出现一次的数字

题目详细说明:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

思路:本题利用按位异或的特性即可(a ^ a = 0,a ^ 0 = a)

    public static int func(int[] array) {
        int num = array[0];
        for (int i = 1; i < array.length; i++) {
            num ^= array[i];
        }
        return num;
    }

    public static void main(String[] args) {
        int[] array = {1, 2, 2, 3, 3};
        int num = func(array);
        System.out.println(num);
    }

题目5:多数元素

题目详细说明:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素

示例 1:

输入:[2,2,1,1,1,2,2]

输出:2

思路:这道题其实有一个技巧,我们可以先用Arrays.sort先将数组快排一下,既然题目中说多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素,那么我们拿到快排后数组下标为n/2的元素,这个元素里面的值就我们要找的多数元素。

    public static void main(String[] args) {
        int[] array = {2, 2, 1, 1, 1, 2, 2, 2};
        Arrays.sort(array);
        //打印看一下快排的结果
        System.out.println(Arrays.toString(array));
        //打印多数元素的值
        System.out.println(array[array.length / 2]);
    }

题目6:存在连续三个奇数的数组

题目详细说明:给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 true;否则,返回 false 。

示例 1:

输入:arr = [2,6,4,1]

输出:false

示例 2:

输入:arr = [1,2,34,3,4,5,7,23,12]

输出:true

思路:定义一个计数器count用于记录是否存在了三个元素连续十奇数的情况,遍历整个数组,如果元素是奇数count++,并判断一下count是否==3,如果等于就return true;如果元素是偶数count就置为0,如果遍历数组结束了都还没返回的话,就返回false即可。

    public static boolean func(int[] array) {
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] % 2 !=  0) {
                count++;
                if (count == 3) {
                    return true;
                }
            } else {
                count = 0;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        int[] array = {1, 2, 3, 5, 7, 8, 10};
        System.out.println(func(array));
    }

    本篇文章已完结,谢谢支持哟 ^^ !!!


网站公告

今日签到

点亮在社区的每一天
去签到