挑战大厂:关于阿里的这些Java变态面试题目,你能回答上几个?

createh523小时前技术教程4

今日分享开始啦,请大家多多指教~

这篇文章简单给大家做了几个java数组算法例题,包括冒泡排序,选择排序,找最大值、最小值,添加、删除元素等。在面试中也会遇到的问题,是否有自己的答案。大家可以自己动手,把代码实现一下哦!

数组算法例题

1.数组逆序

第一个和最后一个互换,第二个和倒数第二个互换,就相当于把数组像下图一样,进行对折互换,如果数组个数为奇数,则中间保持不变其余元素互换即可

import java.util.Arrays;
class Demo12 {
    public static void main (String[] args) {
        int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        System.out.println(Arrays.toString(arr));
        reverse(arr);
        System.out.println(Arrays.toString(arr));
    }
    /**
     * 数组逆序
     * @param arr
     */
    public static void reverse(int[] arr) {
        for (int i = 0; i < arr.length / 2; i++) {
            int temp = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = arr[i];
            arr[i] = temp;
        }
    }
}

数组展示:System.out.println(Arrays.toString(arr));

2.找出数组中最大值所在下标位置

因为是找下标位置所以可以先定义一个值为数组下标,直接使用 数组[下标] 方式进行比较

import java.util.Arrays;
class Demo13 {
    public static void main (String[] args) {
        int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        // 输出数组
        System.out.println(Arrays.toString(array));
        maxIndexOf(array);
    }
    /**
     * 找到数组中最大的数并且输出
     * @param arr
     */
    public static void maxIndexOf (int[] arr) {
        int maxIndex = 0;
        // i 可以从1开始,不需要maxIndex和自己再比较一次
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > arr[maxIndex]){
                maxIndex = i;
            }
        }
        System.out.printf("最大的数为 : %d 下标为 : %d", arr[maxIndex] , maxIndex);
    }
}

3.找出数组中指定元素第一次出现的下标位置

分析

  1. 第一次出现位置
  2. 如果有多个重复元素
  3. 有可能不存在指定元素

4.在数组中找出指定下标对应的元素

分析:有可能不存在指定的索引

5.找出指定元素在数组中最后一次出现位置

和找出第一个方法差不多

tips:

  • 既然是找最后一个数字,可以倒序查找,提高效率
  • 判断找不到的情况

一定要注意,for循环判断 i < array.length 不是小于等于,因为是从0开始

6.找到元素在指定数组中的所有下标位置

要求:

  • 不允许在方法内打印展示
  • 考虑多个数据情况
  • 需要在方法外获取到下标数据信息
  • 不允许使用数组作为返回值

思考1:

  • 保存查询数据的下标位置一定会用到数组
  • 保存下标的数组数据类型是int类型

解决:

另外使用一个数组,作为形式参数,传递首地址,使用此数组存放下标位置,因为是传递的地址,可以直接更改数组内容,并不需要返回数组的值

思考2:

需要考虑保存下标的数组容量

解决:

返回值数组容量和原数组容量一致,这样即使数组内元素值一致且被选中,也可以存储下来

思考3:

返回值,怎么表示,用什么类型数据

new创建一个新的数组,int类型数组中,所有元素初始值都是0,用什么判断元素索引

解决:

返回找到的元素个数,没有则返回0

7.在指定位置插入指定元素

方法分析:

  • public static 不要问

返回值类型:

  • void 可用,但不建议
  • boolean 可以true false 选择boolean类型
  • int 可用 返回值的含义约束较为麻烦

方法名

  • add 添加操作

形式参数列表

  • 需要插入数据的数组
  • 指定插入数据的下标位置
  • 指定插入的数据

(int[] arr,int index,int insert);

方法声明

public static boolean add(int[] arr,int index,int insert);

在数组指定位置添加元素,指定位置后面的依次往后移一位,最后一个0就是要被挤掉的,可以从后向前进行循环操作

核心代码

for (int i = array.length - 1; i > index; i--) {
				array[i] = array[i-1];
			}
			array[index] = insert;

全部代码

超出数组会溢出

8.删除数组中指定下标的元素

和添加元素基本一致,逻辑变为从删除位置开始之后的元素都往前移一位,直接覆盖掉要删除位置元素

核心代码

for (int i = index; i < array.length - 1; i++) {
				array[i] = array[i+1];
			}
			// 最后一个元素补零
			array[array.length - 1] = 0;
			return true;

0代表无效元素,占位使用

全部代码

9.冒泡排序算法

首先要明白一点,形参是引用传值,传的是数组的首地址,操作的还是原来的数组

package cn.ocean888;
import java.util.Arrays;
public class Demo4 {
	public static void main(String[] args) {
		int[] array = { 4399, 3, 360, 3, 4, 11, 32, 3, 123, 86};
		System.out.println(Arrays.toString(array));
		arraySort(array);
		System.out.println(Arrays.toString(array));
	}   
    	public static void arraySort(int[] array) {
		array[5] = 0;
	}
}

for循环示意图,也就是10个数两两比较,需要9次可以找出一个最大值,并且将最大值放到最后边

i表示外部即第一层循环控制循环次数

j表示内部即第二层循环控制那些数两两间进行比较

i=0 时,j 要循环9次,找出最大值放到最后,下一次循环时最大值就不需要再管了

i=1 时,因为已经找到了最大值,所以这次 j 循环八次就可以了

i和j的对应关系: j = 数组长度 -1 - i

为啥要减1:因为10个数两两比较,仅需要比较九次

源码如下

排序效果

10.选择排序

选择排序基本想法是:比如有10个数,最大值在每次循环前初始化设置为数组第1个元素的值即array[0],然后与数组的其他剩余元素进行比较,所以比较次数就是数组总元素-1,10个数循环9次就可以找到最大值,最大值和本次最后的项位置进行互换

在i=1时,因为已经找到一个最大值并且放到最后了,所以j可以少循环依次

j = 数组的长度-i-1

i = 1 时

效果展示

选择排序相较于冒泡排序来说要快一些,选择排序的时间复杂度为n(n-1)/2,而冒泡排序为O(n^2),一般建议选择排序,当然还有其他更好的排序方法。

小结

简单和大家说下数组的内容,数据类型,告知编译器,当前数组中能够保存的数据类型是什么,定义之后,整个数组中保存的数据类型不能修改,操作数据非常重要。

今日份分享已结束,请大家多多包涵和指点!

相关文章

「算法」冒泡排序图文讲解

世界上只有少数人能够最终达到自己的理想。———— 毛姆《月亮与六便士》一、算法思想冒泡排序,有时也称为下沉排序,是一种简单的排序算法,它重复遍历要排序的列表,比较每对相邻的元素,如果它们的顺序错误(升...

Java程序员必备的算法与数据结构

Java程序员必备的算法与数据结构在编程的世界里,Java程序员就像是一个魔术师,而算法和数据结构就是他们的魔法道具。没有这些工具,我们的代码就会像失去了魔力的咒语一样无力。今天,就让我们一起揭开Ja...

看动画学算法之:排序-冒泡排序

简介排序可能是所有的算法中最最基础和最最常用的了。排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序。排序算法有很多种,每个都有其自身的优点和局限性。今天我们来学习最最...

Java程序员必须掌握的算法与数据结构

Java程序员必须掌握的算法与数据结构在编程的世界里,Java程序员就像一位建筑设计师,而算法与数据结构则是这位设计师手中的画笔和工具。掌握它们,就像掌握了一把打开编程世界大门的钥匙。首先,我们来聊聊...

冒泡排序算法

在日常开发中经常会遇到一类问题,就是对一个集合的数据进行排序掌握一些排序算法,对于日常开发是非常有帮助的今天介绍一下冒泡排序法算法逻辑时间复杂度由上图逻辑可以得出,冒泡排序的循环次数为由循环次数可以得...

如何高效解决Java性能瓶颈:从定位到优化

如何高效解决Java性能瓶颈:从定位到优化在Java开发的世界里,性能问题就像幽灵一样潜伏在每一个角落。当你精心构建的应用突然变得缓慢不堪,仿佛被施了魔法,这便是性能瓶颈找上门来了。那么,我们该如何面...