Java面试中经常问到的算法题

简介: 从大学到现在,参加过很多面试,经常会被问到一些基本的算法题,而大部分算法的理论及思想,我们曾经都能倒背如流,并且也用语言实现过,可由于在项目开发中应用的比较少,久而久之就忘记了,造成在面试中很尴尬的局面,然后回来查阅相关资料才发现就那么一回事,怎么在面试中就卡壳了呢?在此写下我在面试中经常被问到的一些基本的算法,全当复习。

 从大学到现在,参加过很多面试,经常会被问到一些基本的算法题,而大部分算法的理论及思想,我们曾经都能倒背如流,并且也用语言实现过,可由于在项目开发中应用的比较少,久而久之就忘记了,造成在面试中很尴尬的局面,然后回来查阅相关资料才发现就那么一回事,怎么在面试中就卡壳了呢?在此写下我在面试中经常被问到的一些基本的算法,全当复习。

一、冒泡排序

Java代码 
package sort.bubble;   
import java.util.Random;   
/**  
 * 依次比较相邻的两个数,将小数放在前面,大数放在后面  
 * 冒泡排序,具有稳定性  
 * 时间复杂度为O(n^2)  
 * 不及堆排序,快速排序O(nlogn,底数为2)  
 * @author liangge  
 *  
 */  
public class Main {   
    public static void main(String[] args) {   
        Random ran = new Random();   
        int[] sort = new int[10];   
        for(int i = 0 ; i < 10 ; i++){   
            sort[i] = ran.nextInt(50);   
        }   
        System.out.print("排序前的数组为");   
        for(int i : sort){   
            System.out.print(i+" ");   
        }   
        buddleSort(sort);   
        System.out.println();   
        System.out.print("排序后的数组为");   
        for(int i : sort){   
            System.out.print(i+" ");   
        }   
    }   
    /**  
     * 冒泡排序  
     * @param sort  
     */  
    private static void buddleSort(int[] sort){   
        for(int i=1;i<sort.length;i++){   
            for(int j=0;j<sort.length-i;j++){   
                if(sort[j]>sort[j+1]){   
                    int temp = sort[j+1];   
                    sort[j+1] = sort[j];   
                    sort[j] = temp;   
                }   
            }   
        }   
    }   
}  
package sort.bubble;
import java.util.Random;
/**
 * 依次比较相邻的两个数,将小数放在前面,大数放在后面
 * 冒泡排序,具有稳定性
 * 时间复杂度为O(n^2)
 * 不及堆排序,快速排序O(nlogn,底数为2)
 * @author liangge
 *
 */
public class Main {
  public static void main(String[] args) {
    Random ran = new Random();
    int[] sort = new int[10];
    for(int i = 0 ; i < 10 ; i++){
      sort[i] = ran.nextInt(50);
    }
    System.out.print("排序前的数组为");
    for(int i : sort){
      System.out.print(i+" ");
    }
    buddleSort(sort);
    System.out.println();
    System.out.print("排序后的数组为");
    for(int i : sort){
      System.out.print(i+" ");
    }
  }
  /**
   * 冒泡排序
   * @param sort
   */
  private static void buddleSort(int[] sort){
    for(int i=1;i<sort.length;i++){
      for(int j=0;j<sort.length-i;j++){
        if(sort[j]>sort[j+1]){
          int temp = sort[j+1];
          sort[j+1] = sort[j];
          sort[j] = temp;
        }
      }
    }
  }
}

二、选择排序

Java代码 
package sort.select;   
import java.util.Random;   
/**  
 * 选择排序  
 * 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,  
 * 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。   
 * 选择排序是不稳定的排序方法。  
 * @author liangge  
 *   
 */  
public class Main {   
    public static void main(String[] args) {   
        Random ran = new Random();   
        int[] sort = new int[10];   
        for (int i = 0; i < 10; i++) {   
            sort[i] = ran.nextInt(50);   
        }   
        System.out.print("排序前的数组为");   
        for (int i : sort) {   
            System.out.print(i + " ");   
        }   
        selectSort(sort);   
        System.out.println();   
        System.out.print("排序后的数组为");   
        for (int i : sort) {   
            System.out.print(i + " ");   
        }   
    }   
    /**  
     * 选择排序  
     * @param sort  
     */  
    private static void selectSort(int[] sort){   
        for(int i =0;i<sort.length-1;i++){   
            for(int j = i+1;j<sort.length;j++){   
                if(sort[j]<sort[i]){   
                    int temp = sort[j];   
                    sort[j] = sort[i];   
                    sort[i] = temp;   
                }   
            }   
        }   
    }   
}  
package sort.select;
import java.util.Random;
/**
 * 选择排序
 * 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,
 * 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 
 * 选择排序是不稳定的排序方法。
 * @author liangge
 * 
 */
public class Main {
  public static void main(String[] args) {
    Random ran = new Random();
    int[] sort = new int[10];
    for (int i = 0; i < 10; i++) {
      sort[i] = ran.nextInt(50);
    }
    System.out.print("排序前的数组为");
    for (int i : sort) {
      System.out.print(i + " ");
    }
    selectSort(sort);
    System.out.println();
    System.out.print("排序后的数组为");
    for (int i : sort) {
      System.out.print(i + " ");
    }
  }
  /**
   * 选择排序
   * @param sort
   */
  private static void selectSort(int[] sort){
    for(int i =0;i<sort.length-1;i++){
      for(int j = i+1;j<sort.length;j++){
        if(sort[j]<sort[i]){
          int temp = sort[j];
          sort[j] = sort[i];
          sort[i] = temp;
        }
      }
    }
  }
}

三、快速排序

Java代码 
package sort.quick;   
/**  
 * 快速排序 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小,  
 * 然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行,以此达到整个数据变成有序序列。  
 * @author liangge  
 *   
 */  
public class Main {   
    public static void main(String[] args) {   
        int[] sort = { 54, 31, 89, 33, 66, 12, 68, 20 };   
        System.out.print("排序前的数组为:");   
        for (int data : sort) {   
            System.out.print(data + " ");   
        }   
        System.out.println();   
        quickSort(sort, 0, sort.length - 1);   
        System.out.print("排序后的数组为:");   
        for (int data : sort) {   
            System.out.print(data + " ");   
        }   
    }   
    /**  
     * 快速排序  
     * @param sort 要排序的数组  
     * @param start 排序的开始座标  
     * @param end 排序的结束座标  
     */  
    public static void quickSort(int[] sort, int start, int end) {   
        // 设置关键数据key为要排序数组的第一个元素,   
        // 即第一趟排序后,key右边的数全部比key大,key左边的数全部比key小   
        int key = sort[start];   
        // 设置数组左边的索引,往右移动判断比key大的数   
        int i = start;   
        // 设置数组右边的索引,往左移动判断比key小的数   
        int j = end;   
        // 如果左边索引比右边索引小,则还有数据没有排序   
        while (i < j) {   
            while (sort[j] > key && j > start) {   
                j--;   
            }   
            while (sort[i] < key && i < end) {   
                i++;   
            }   
            if (i < j) {   
                int temp = sort[i];   
                sort[i] = sort[j];   
                sort[j] = temp;   
            }   
        }   
        // 如果左边索引比右边索引要大,说明第一次排序完成,将sort[j]与key对换,   
        // 即保持了key左边的数比key小,key右边的数比key大   
        if (i > j) {   
            int temp = sort[j];   
            sort[j] = sort[start];   
            sort[start] = temp;   
        }   
        //递归调用   
        if (j > start && j < end) {   
            quickSort(sort, start, j - 1);   
            quickSort(sort, j + 1, end);   
        }   
    }   
}  
package sort.quick;
/**
 * 快速排序 通过一趟排序将要排序的数据分割成独立的两部分, 其中一部分的所有数据都比另外一部分的所有数据都要小,
 * 然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行,以此达到整个数据变成有序序列。
 * @author liangge
 * 
 */
public class Main {
  public static void main(String[] args) {
    int[] sort = { 54, 31, 89, 33, 66, 12, 68, 20 };
    System.out.print("排序前的数组为:");
    for (int data : sort) {
      System.out.print(data + " ");
    }
    System.out.println();
    quickSort(sort, 0, sort.length - 1);
    System.out.print("排序后的数组为:");
    for (int data : sort) {
      System.out.print(data + " ");
    }
  }
  /**
   * 快速排序
   * @param sort 要排序的数组
   * @param start 排序的开始座标
   * @param end 排序的结束座标
   */
  public static void quickSort(int[] sort, int start, int end) {
    // 设置关键数据key为要排序数组的第一个元素,
    // 即第一趟排序后,key右边的数全部比key大,key左边的数全部比key小
    int key = sort[start];
    // 设置数组左边的索引,往右移动判断比key大的数
    int i = start;
    // 设置数组右边的索引,往左移动判断比key小的数
    int j = end;
    // 如果左边索引比右边索引小,则还有数据没有排序
    while (i < j) {
      while (sort[j] > key && j > start) {
        j--;
      }
      while (sort[i] < key && i < end) {
        i++;
      }
      if (i < j) {
        int temp = sort[i];
        sort[i] = sort[j];
        sort[j] = temp;
      }
    }
    // 如果左边索引比右边索引要大,说明第一次排序完成,将sort[j]与key对换,
    // 即保持了key左边的数比key小,key右边的数比key大
    if (i > j) {
      int temp = sort[j];
      sort[j] = sort[start];
      sort[start] = temp;
    }
    //递归调用
    if (j > start && j < end) {
      quickSort(sort, start, j - 1);
      quickSort(sort, j + 1, end);
    }
  }
}

四、插入排序

Java代码 
package sort.insert;   
/**  
 * 直接插入排序  
 * 将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据  
 * 算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。  
 */  
import java.util.Random;   
public class DirectMain {   
    public static void main(String[] args) {   
        Random ran = new Random();   
        int[] sort = new int[10];   
        for (int i = 0; i < 10; i++) {   
            sort[i] = ran.nextInt(50);   
        }   
        System.out.print("排序前的数组为");   
        for (int i : sort) {   
            System.out.print(i + " ");   
        }   
        directInsertSort(sort);   
        System.out.println();   
        System.out.print("排序后的数组为");   
        for (int i : sort) {   
            System.out.print(i + " ");   
        }   
    }   
    /**  
     * 直接插入排序  
     *   
     * @param sort  
     */  
    private static void directInsertSort(int[] sort) {   
        for (int i = 1; i < sort.length; i++) {   
            int index = i - 1;   
            int temp = sort[i];   
            while (index >= 0 && sort[index] > temp) {   
                sort[index + 1] = sort[index];   
                index--;   
            }   
            sort[index + 1] = temp;   
        }   
    }   
}  
package sort.insert;
/**
 * 直接插入排序
 * 将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据
 * 算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
 */
import java.util.Random;
public class DirectMain {
  public static void main(String[] args) {
    Random ran = new Random();
    int[] sort = new int[10];
    for (int i = 0; i < 10; i++) {
      sort[i] = ran.nextInt(50);
    }
    System.out.print("排序前的数组为");
    for (int i : sort) {
      System.out.print(i + " ");
    }
    directInsertSort(sort);
    System.out.println();
    System.out.print("排序后的数组为");
    for (int i : sort) {
      System.out.print(i + " ");
    }
  }
  /**
   * 直接插入排序
   * 
   * @param sort
   */
  private static void directInsertSort(int[] sort) {
    for (int i = 1; i < sort.length; i++) {
      int index = i - 1;
      int temp = sort[i];
      while (index >= 0 && sort[index] > temp) {
        sort[index + 1] = sort[index];
        index--;
      }
      sort[index + 1] = temp;
    }
  }
}

 

五、顺便贴个二分搜索法

Java代码

package search.binary;   
public class Main {   
    public static void main(String[] args) {   
        int[] sort = {1,2,3,4,5,6,7,8,9,10};   
        int mask = binarySearch(sort,6);   
        System.out.println(mask);   
    }   
    /**  
     * 二分搜索法,返回座标,不存在返回-1  
     * @param sort  
     * @return  
     */  
    private static int binarySearch(int[] sort,int data){   
        if(data<sort[0] || data>sort[sort.length-1]){   
            return -1;   
        }   
        int begin = 0;   
        int end = sort.length;   
        int mid = (begin+end)/2;   
        while(begin <= end){   
            mid = (begin+end)/2;   
            if(data > sort[mid]){   
                begin = mid + 1;   
            }else if(data < sort[mid]){   
                end = mid - 1;   
            }else{   
                return mid;   
            }   
        }   
        return -1;   
    }   
}  
相关文章
|
4月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
203 2
|
4月前
|
存储 安全 Java
常见 JAVA 集合面试题整理 自用版持续更新
这是一份详尽的Java集合面试题总结,涵盖ArrayList与LinkedList、HashMap与HashTable、HashSet与TreeSet的区别,以及ConcurrentHashMap的实现原理。内容从底层数据结构、性能特点到应用场景逐一剖析,并提供代码示例便于理解。此外,还介绍了如何遍历HashMap和HashTable。无论是初学者还是进阶开发者,都能从中受益。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
224 3
|
3月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
336 0
|
4月前
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
1437 48
|
3月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
116 1
|
4月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
116 5
|
4月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
153 5
|
4月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
201 6
|
4月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
200 1
|
4月前
|
算法 Java 微服务
2025 年 Java 面试宝典社招春招秋招实操全方位攻略
2025年Java面试宝典涵盖核心技术及最新趋势,分为四大板块:1. Java基础:深入数据类型、多态等特性,结合学生信息管理等实例;2. JVM核心:解析内存模型与GC算法,附多线程转账等场景应用;3. 高并发方案:详解synchronized与线程池配置,提供Web服务器优化案例;4. Spring生态:剖析IoC/AOP原理,演示微服务架构实现。特别新增Java 17+特性实操,包括Record类、密封接口等语法糖,整合Spring Boot 3、响应式编程及云原生技术,通过订单状态机、API网关配置。
266 1

热门文章

最新文章