数组部分的笔试题

目录

1.二分查找(前提:在有序的集合中)

 2.递归实现二分查找

3.面试题 

4.将数组转为字符串

5.复习:数组

6.引用数据类型值null的情况

7.数组作为方法的返回值(还有就是作为参数的情况)

8.数组的拷贝

 9.数组求和的递归方法(俩种)

 10.数组逆序(双引用)

 11.数组数字排列

12二维数组

1.二分查找(前提:在有序的集合中)

快速排序(21世纪最伟大的算法)和归并排序nlogn数量级

将数组分为了left,mid,right。根据查找元素和mid的大小关系调整left或right取值--折纸过程

以升序数组为例:

1.先比较要查找的元素和中间元素的大小关系mid

mid==toFind

return mid

2.toFind>mid,我们就从mid+1继续上述过程

left=mid+1;

3.toFind<mid,从mid-1开始作为查找的子区间

注意:left=right时,说明此时区间里只剩下一个元素,当left<right,说明为空区间。

二分查找的查找次数:每次根据查找元素的大小与中间位置的元素相比将区间变为原来的1/2

到区间只剩下最后一个元素时终止,所以查找次数是logn级别的

public static int binerarySearch(int []arr,int val){
        int left=0;
        int right=arr.length-1;
        while(left<=right) {//如果不懂举个例子
            int mid=(right+left)>>1;
            if(arr[mid]==val){
                return mid;
            }else if (val > arr[mid]) {
                left = mid + 1;
            }else{
                right= mid - 1;
            }
        }
        return -1;
    }
}

 2.递归实现二分查找

  public static int binerarySearch2(int[] arr,int val){
       return binarySearchInternal(arr,val,0, arr.length-1);
    }
    public static int binarySearchInternal(int [] arr,int val,int left,int right){
        if(left>right){
            //空区间
            return -1;
        }
        int mid=(left+right)/2;
        if(arr[mid]==val)return mid;
        else if(val<arr[mid]){
            return binarySearchInternal(arr,val,0,mid-1);
        }else{
           return binarySearchInternal(arr,val,mid+1, arr.length-1);
        }
    }

3.面试题 

在500w的集合中找到特定元素

1.先使用快排给数组排序Array.sort(arr);这个方法默认是升序的

2.二分查找

4.将数组转为字符串

 序列化:把任何类型转为String类型

 这样写输出的是地址,后面是地址的哈希码

写为System.out.println(Arrays.toString(arr));打印的是值

Arrays是JDK内置的工具类,java.util.Arrays

java类命名-s就是java的工具类(内置了很多实用操作)

Collections

5.复习:数组

a.数组的初始化操作分为静态和动态

静态初始化:int[]arr={1,3,5};

动态初始化:int []arr=new int[3];赋值是写为:int[] arr=new int[]{1,3,5};

b.关于数组长度的取得和访问元素

数组名称.length

索引:0-length-1

c.内存区域划分:JMM------六块区域

栈:方法的局部变量(形参,方法中定义的若干变量)

堆:只要new出来的对象都在堆中存储

如:

引用只是给对象起了个别名,保存的是对象的地址。

问: 假设现在有俩个数组引用:引用b对于数组内容的修改影响引用a指向的数组内容?

答:就要看引用a和b是否保存同一块地址。

6.引用数据类型值null的情况

1.所有引用的默认值为null

2.当引用数据类型保存的值为null时,表示该引用没有指向任何内存空间,若仍然使用该引用去访问内存,就会报NullPointerException(运行时异常)//程序在运行时异常

7.数组作为方法的返回值(还有就是作为参数的情况)

 注:for-each只能用于变量,不能用于改数组

8.数组的拷贝

 这个ret是个新数组,所以10被改了

Arrays,copyOf(原数组名称,拷贝后的新数组长度)//从数组的第一个元素开始拷贝

 深浅拷贝:拷贝后的数组对象确实是新的对象,只是将原数组的内容复制给新数组

浅拷贝,实际没有创建新的数组,只是整了一个新数组的引用而已。(Cloneable那里讲)

Arrays.copyOfRange(arr,2,4);//从第二个索引到第四个索引,[from,to)。

自己实现一个数组的全拷贝;

 public static int[] arrCopy(int [] arr){
        int []ret=new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            ret[i]=arr[i];
        }
        return ret;
    }

找无序数组中的最大值

 9.数组求和的递归方法(俩种)

 

 double sum=sum(arr);小到大类型转换可以

 冒泡排序的思路:

从第一个元素开始两两比较,将大元素交换到后面,没走一次保证把较大元素放在最终位置。

 优化之后:

i<arr.length-1就可以了

当发现某一趟中没有元素交换,arr[j]<arr[j+1]说明集合已经有序,不用再交换了

 10.数组逆序(双引用)

 11.数组数字排列

 /*
    * 数组的数字排列(偶数放前面,奇数放后面)
    * */
    public static void transPorm(int [] arr) {
        int left = 0;
        int right = arr.length - 1;
        while (left<right){
            while(left<right&&arr[left]%2==0){
                left++;
            }
            //left指向第一个奇数
            while(left<right&&arr[right]%2!=0){
                right++;
            }
            //right指向第一个偶数
            int tmp=arr[left];
            arr[left]=arr[right];
            arr[right]=tmp;
        }
    }
}

12二维数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值