目录
题目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));}
本篇文章已完结,谢谢支持哟 ^^ !!!