笔试常用算法

1.滑动数组

思路:先记录下第一个要求长度里满足的条件值,再设置左右指针分别向前推进数组,并计算新数组的条件值,遍历结束记录下最大值返回。

public int maxVowels(String s, int k) {
        char [] ch = s.toCharArray();
        int left=-1,right=k-1,max = 0,sum=0;
        for(int i=0;i<ch.length&&i<k;i++){
            if(check(ch[i]))max++;
        }
        sum=max;
        while(right<ch.length){
            left++;
            right++;
            if(right<ch.length&&check(ch[right]))sum++;
            if(check(ch[left]))sum--;
            max = Math.max(max,sum);
        }

        return max;
    }

 

KMP算法

import java.util.*;
public class KMP {
    public static void main(String[] args){
        String str1="ababaababca";
        String str2="ababca";
        int[] next=Getnext(str2);
        System.out.println(Arrays.toString(next));
        int x=KMP(str1,str2,next);
        System.out.println(x);
    }
    public static int[] Getnext(String str2){
        int len=str2.length();
        int [] next=new int[len];
        next[0]=-1;
        int i=0,j=-1;
        while(i<len-1){
            if(j==-1||str2.charAt(i)==str2.charAt(j)){
                next[++i]=++j;
            }
            else
                j=next[j];
        }
        return next;
    }
    public static int KMP(String str1,String str2,int[] next){
        int x=0,y=0;
        int len=str2.length();
        while(x<str1.length()&&y<len){
            if(y==-1||str1.charAt(x)==str2.charAt(y)){
                x++;y++;
            }
            else
                y=next[y];
            System.out.println(x +" "+y);
        }
        return y==len?x-y:-1;
    }
}

快速排序(从大到小)

public class KSPX {

	public static void main(String[] args) {
		int sum[]={2,6,8,9,15,4,7,9,5};
		SSR(sum,0,sum.length-1);
		for(int i=0;i<sum.length;i++){
			System.out.print(sum[i]+" ");
		}

	}
      public static void SSR(int[] sum,int strart,int end){
    	if(strart<end){
    		int p=core(sum,strart,end);
    		SSR(sum,strart,p-1);
    		SSR(sum,p+1,end);
    	}      
    }
      public static int core(int[] sum, int strart,int end){
    	  int x=sum[end];
    	  int i=strart;//记录下标
    	  for(int j=strart;j<end;j++){
    		  if(sum[j]>x){
    			  wap(sum,i,j);
    			  i++;
    		  }
    	  }
    	  wap(sum,i,end);
    	  return i;
      }
      
      public static void wap(int[] sum,int i,int j){
    	  int a=sum[i];
    	  sum[i]=sum[j];
    	  sum[j]=a;
    		
      }
 
}

二分查找

public static int erSearch(int[] A,int k){
		int x=0,y=A.length-1;
		int middle=0;
		if(k < A[x]||k > A[y]||x > y)
			return -1;	
		while(x<=y){
			middle=(x+y)/2;
			if(A[middle]>k){
				y=middle-1;
			}
			else if(A[middle]<k){
				x=middle+1;
			}
			else
				return middle;
		}
		return -1;
	}

并归排序

堆排序

import java.lang.reflect.Array;
import java.util.*;
public class HeapSort {
    public static void main(String[] args) {
        int[] array = new int[] { 2, 1, 4, 3, 6, 5, 8, 7 };
        sort(array);
        System.out.println(Arrays.toString(array));
    }

    public static void sort(int[] array) {
        for (int i = array.length / 2 - 1; i >= 0; i--) {
            adjustHeap(array, i, array.length);
        }
        for (int j = array.length - 1; j > 0; j--) {
            // 元素交换
            swap(array, 0, j);
            adjustHeap(array, 0, j);
        }
    }

    public static void adjustHeap(int[] array, int i, int length) {
        int temp = array[i];
        for (int k = 2 * i + 1; k < length; k = 2 * k + 1) {
            if (k + 1 < length && array[k] < array[k + 1]) {
                k++;
            }
            // 如果发现子节点更大,则进行值的交换
            if (array[k] > temp) {
                swap(array, i, k);
                // 所以,循环对子节点所在的树继续进行判断
                i = k;
                // 如果不用交换,那么,就直接终止循环了
            } else {
                break;
            }
        }
    }

    public static void swap(int[] arr, int a, int b) {
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }
}

Manacher算法

二叉树的层次遍历(队列实现)

import java.util.Queue;
import java.util.LinkedList;
public class Solution {
    public int TreeDepth(TreeNode root) {
        if(root==null){
            return 0;
        }
        Queue<TreeNode> list=new LinkedList<>();
        list.add(root);
        int len=0,sum=0,count=1;//sum为当前计算的父节点数,count为之前存储的父节点数
        while(list.size()!=0){
        TreeNode top=list.poll();
        sum++;  
        if(top.left!=null){
            list.offer(top.left);
        }
        if(top.right!=null){
            list.offer(top.right);
        }
        if(sum==count){  //当扫描完一层时,深度加1
            count=list.size();
            sum=0;
            len++;
        }
        }
        return len;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值