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

7次阅读

共计 2992 个字符,预计需要花费 8 分钟才能阅读完成。

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

这篇文章简略给大家做了几个 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),个别倡议抉择排序,当然还有其余更好的排序办法。

小结

简略和大家说下数组的内容,数据类型,告知编译器,以后数组中可能保留的数据类型是什么,定义之后,整个数组中保留的数据类型不能批改,操作数据十分重要。

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

正文完
 0