大数据面试之(java)02

第2章 数据结构
2.1 如果链表的实现方式中 hash 的值有冲突的话,怎么解决?如果解决以后怎么解决再链表的常数次的查询?
答案:使用链表来存储重复的 hash 值,如何对链表进行常数次的查找,需要将链表+随机数再hash。
2.2 手写冒泡排序
这个建议大家在去面试之前一定要牢牢的记住怎么写,这样才能在面试官面前书写流畅。
算法思想:
(1)将序列中所有元素两两比较,将最大的放在最后面。
(2)将剩余序列中所有元素两两比较,将最大的放在最后面。
(3)重复第二步,直到只剩下一个数。
/**
* 冒泡排序:两两比较,大者交换位置,则每一轮循环结束后最大的数就会移动到最后.
* 时间复杂度为O(n²) 空间复杂度为O(1)
*/
private static void bubbleSort(int[] arr) {
//外层循环length-1次
for (int i = 0; i < arr.length-1; i++) {
//外层每循环一次最后都会排好一个数
//所以内层循环length-1-i次
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}

2.3 二分查找
public static int binarySearch(int srcArray,int des){
int low=0;
int height=srcArray.length-1;
while(low<=height){
int middle=(low+height)/2;
if(des==srcArray[middle]){
return middle;
}else if(des<srcArray[middle]){
height=middle-1;
}else{
low=middle+1;
}
}
return -1;
}

2.4 递归的方式实现:
public static int binarySearch(int[] dataset;int data,int beginIndex,int endIndex){ int midIndex=(beginIndex+endIndex)/2;
if(data<dataset[beginIndex] || data>dataset[endIndex] || beginIndex>endIndex){
return -1;
}
if(data<dataset[midIndex]){
return binarySearch(dataset,data,beginIndex,midelIndex-1); }else if(data>dataset[midIndex]){
return binarySearch(dataset,data,midIndex+1,endIndex); }else{
return midIndex;
}
}

2.5 单链表反转
class ListNode { int val; ListNode next;
ListNode(int x) {
val = x;
} }
public static ListNode reverseList(ListNode head){
ListNode prev=null;
while(head != null){
ListNode temp=head.next;
head.next=prev;
prev =head;
head =temp;
}
return prev;
}

2.6 插入排序:

初始时假设第一个记录自成一个有序序列,其余记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直至最后一个记录插入到有序序列中为止
public static void insertSort(int[] a){
int temp;
for(int i=1;i<a.length;i++){
for(int j=i;j>0;j–){
if(a[j-1]>a[j]){
temp=a[j-1]
a[j-1]=a[j]
a[j]=temp
}
}
}
}

2.7 选择排序:
把最小或者最大的选择出来 对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换;接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小的记录并与第二个记录进行位置交换;重复该过程,直到进行比较的记录只有一个时为止。
public static void selectSort(int[] a){
if (a == null || a.length <= 0) {
return;
}
for(int i=0;i<a.length;i++){
int min=i;
for(int j=i+1;j<a.length;j++){
if(a[j]<a[min]){
min=j;
}
}
if (i != min) {
int tmp = a[min];
a[min] = a[i];
a[i] = tmp;
}
}
}

2.8 什么是队列
答:就是一种简单的调度策略,先来先进,先进先出
2.9 代码怎么确定二叉树的高度?
答:可以用后序遍历二叉树,层次遍历二叉树,递归遍历二叉树
2.10 给你一个数组里面有奇数、偶数,写一个算法实现奇数全在最左侧,偶数全在最右侧

/定义一个方法,接收一个int数组,在方法内新建一个数组,
将传进来的数组中的元素装进去,但是要求奇数在左边偶数在右边。
最后返回这个新数组。在main方法中调用定义数组,调用该方法,获取返回值,
并遍历输出返回的数组
/
public class Test34 {
public static void main(String[] args) {
int[] arr={1,2,3,4,5,6,7,8,9,0};
int[] newArr=newArray(arr);
// 遍历数组
for (int i = 0; i < newArr.length; i++) {
System.out.print(newArr[i]+"\t");
}
}

public static int[] newArray(int[] arr) {
    int[] newArr=new int[arr.length];//定义新的数组
    //定义两个变量
    int index1=0;
    int index2=arr.length-1;
    for (int i = 0; i < arr.length; i++) {
        if (arr[i] % 2 != 0) {
            //奇数放到新数组的左边
           newArr[index1]=arr[i];
           //索引值++
            index1++;
        }else {
            //偶数放到新数组的右边边
            newArr[index2]=arr[i];
            //索引值--
            index2--;
        }
    }
    return newArr;
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值