笔试算法题

1. 最小的k个数

大根堆就是根节点比左右孩子都要大或者等于的二叉树,小根堆就是根节点比左右孩子都要小或者等于的二叉树
将前k个数插入大根堆,从第k+1个数开始遍历,如果比大根堆堆顶小,把堆顶的数弹出,插入当前数。

 import java.util.*;
class Solution{
   public int[] getLeastNumbers(int[] arr,int k){
       int[] vec=new int[k];
       if(k==0){
           return vec;
       }
       PriorityQueue<Integer> queue=new PriorityQueue<>(new Comparator<Integer>() {
           @Override
           public int compare(Integer o1, Integer o2) {
               return o2-o1;
           }
       });
       for(int i=0;i<k;i++){
           queue.offer(arr[i]);
       }
       for(int i=k;i<arr.length;i++){
           if(queue.peek()>arr[i]){
               queue.poll();
               queue.offer(arr[i]);
           }
       }
       for(int i=0;i<k;i++){
           vec[i]=queue.poll();
       }
       return vec;
   }
}

快排思想
**

import java.util.*;
class Solution{
        public static  int[] getLeastNumber(int[] arr,int k){
            if(k>=arr.length) return arr;
            return quickSort(arr,k,0,arr.length-1);
    }
    private static int[] quickSort(int[] arr,int k,int l,int r){
            int i=l,j=r,val=arr[l];
            while(i<j){
                while(i<j && arr[j]>val) j--;
                if(i<j)
                    arr[i++]=arr[j];
                while(i<j&& arr[i]<val)i++;
                if(i<j)
                    arr[j--]=arr[i];
            }
            arr[i]=val;
            if(i>k) return quickSort(arr,k,l,i-1);
            if(i<k) return quickSort(arr,k,i+1,r);
            return Arrays.copyOf(arr,k);
    }
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int k=2;
        int a[] = {1,2,6,8,5,4};
        getLeastNumber(a,2);
        for(int i=0;i<a.length;i++){
            System.out.println(a[i]);
        }
    }
    }

**
类实现Comparable接口(重写compareTo()方法),或提供Comparator接口(重写compare()方法)
在这里插入图片描述
在这里插入图片描述

import java.util.*;
class Solution{


    public static void main(String[] args) {
        String[] str = new String[5];
        str[0]="3";
        str[1]="1";
        str[2]="2";
        str[3]="5";
        str[4]="4";
         Arrays.sort(str, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
                   // TODO Auto-generated method stub
                      return o1.compareTo(o2)<0?1:0;
            }
 });
Arrays.sort(str);//不加不排序
        for (int i = 0; i < str.length ; i++) {
            System.out.println(str[i]);
        }
    }
}

在这里插入图片描述
实现Comparable接口(重写compareTo()方法)

public class Test {
    public static void main(String[] args) {
        Student stu1 = new Student("hubert",20);
        Student stu2 = new Student("jake",18);
        System.out.println(stu1.compareTo(stu2));//结果为1
    }
}
 
class Student implements Comparable<Student>{
    private String name;
    private int age;
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public int compareTo(Student o) {
        return this.age<o.age?-1:this.age==o.age?0:1;
    }
}

提供Comparator接口(重写compare()方法)

import java.util.Comparator;
 
public class Test {
    public static void main(String[] args) {
        Student stu1 = new Student("hubert",20);
        Student stu2 = new Student("jake",18);
        int compare = new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge() < o2.getAge() ? -1 : o1.getAge() == o2.getAge() ? 0 : 1;
            }
        }.compare(stu1, stu2);
        System.out.println(compare);
 
    }
}
 
class Student{
    private String name;
    private int age;
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
 
    public int getAge() {
        return age;
    }
 
}

2、将两个无序链表合并成一个有序链表并返回
3、力扣1079
4、钻石
5、字符串瘦身
6、两个数组之间的距离

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值