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

一、冒泡排序

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

for(int j=0;j

if(sort[j]>sort[j+1]){

int temp = sort[j+1];

sort[j+1] = sort[j];

sort[j] = 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

for(int j = i+1;j

if(sort[j]

int temp = sort[j];

sort[j] = sort[i];

sort[i] = temp;

}

}

}

}

}

三、快速排序

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.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 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(datasort[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;

}

}

java常问算法题_Java面试中经常问到的算法题相关推荐

  1. 大厂面试官在校招面试中爱问啥?

    如果你在简历中写了这句话,保证能拿到大厂面试机会:扎实的计算机基础,良好的数据结构与算法功底. 然后,你就会被问到头皮发麻. 虽然是段子,但也一定程度上说明了大厂非常注重计算机基础,也是真的喜欢问计算 ...

  2. java集合sort底层实现_Java面试总结系列之Collections.sort()

    面试中被问到,集合类中的排序方法是怎么实现的?没有回答上来,故而总结如下:你知道么? 前提:在eclipse中对于自己的代码可以通过按住Ctrl的同时单击名称跳入相应源码中.但eclipse默认没有添 ...

  3. c语言减治法求a的n次方算法,拜托,面试别再问我斐波那契数列了!!!

    面试中,问得比较多的几个问题之一,求斐波那契数列f(n)? 画外音:姐妹篇 <拜托,面试别再问我TopK了!!!> <拜托,面试别再让我数1了!!!> 什么是斐波那契数列? 斐 ...

  4. 数组去重是面试中经常问到的问题

    数组去重是面试中经常问到的问题 [html] view plaincopy var arr=[1,3,4,52,4,5,4,8,7,6]; 第一种方法:使用ES5中的indexOf进行去重: [jav ...

  5. 面试中被问到婚育问题时要怎么回答呢?

    站在企业的角度想,企业既然想出钱招人,肯定是人手不足,需要快速补充人员运转工作,所以,企业在招聘时就要判断在未来一段时间内,你是否有能力和精力跟企业并肩作战.问这个问题,就是为了了解你是否有能力平衡工 ...

  6. Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户、物品的协同过滤推荐算法 机器学习、分布式大数据、人工智能开发

    Python+Django+Mysql开发在线购物推荐网 协同过滤推荐算法在购物网站中的运用 个性化推荐算法开发 基于用户.物品的协同过滤推荐算法 机器学习.分布式大数据.人工智能开发 ShopRec ...

  7. java面试 设计模式_Java面试中常问到的设计模式

    面试中常问到的设计模式 什么是设计模式? ​设计模式是世界上各种各样程序员用来解决特定设计问题的尝试和测试的方法.设计模式是代码可用性的延伸 单例模式 ​保证被创建一次,节省系统开销 ​饿汉式:上来不 ...

  8. Java面试没过_Java面试中遇到的坑【填坑篇】

    1.StringBuilder替代String拼接,面试中经常会问到 String,StringBuilder,StringBuffer的区别. 解答:String类作为java语言中最常见的字符串类 ...

  9. 面试中常见的数据结构与算法题整理,想当架构师,数据结构与算法不过关可不行(数组+字符串,共60题)

    [Java架构师面试网]收集整理了一些Java面试的常见问题,这些问题可能会在你下一次技术面试中遇到.想成为Java架构师,这些都是不可避免也是必须要掌握的哦,对于其他模块的面试题,我后续也将单独分享 ...

  10. 几道 BAT 算法面试中经常问的「字符串」问题

    https://www.toutiao.com/a6675839856192520711/ String 作为最常见的编程语言类型之一,在算法面试中出现的频率极高. 1. 验证回文串 题目来源于 Le ...

最新文章

  1. graphql redux_如何在Redux应用程序中使用GraphQL
  2. vsCode 开发微信小程序插件
  3. linux嵌入式开发箱跑马灯,跑马灯实验(STM32F4开发板)
  4. 华为android9.0升级,华为官方更新消息:这几款手机9月5日分批推送安卓9.0系统升级...
  5. java ee文件下载_JavaEE实现文件下载
  6. 苹果发布会日期再曝光 2019新iPhone发布会定在这一天?
  7. python自动处理多个txt文件_怎么用python去实现几个文件中内容的并行处理
  8. Web开发笔记(一)
  9. 拉普拉斯(逆)变换的计算
  10. USRP N310+OAI 5G NR分支编译运行
  11. 学前教育怎么利用计算机思维,乐高教育全新推出编程启蒙小火车锻炼孩子计算机思维...
  12. 辞退了一位简历造假的程序员,简历美化可以,造假不可取!
  13. yum安装ruby_安装 Ruby
  14. 基于JAVA南京传媒学院门户网计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  15. vue-cli中配置gzip压缩
  16. STM32解析航模遥控器的PPM信号
  17. 向身边优秀的人学习,让自己变得优秀
  18. 介绍一下国家葡萄产业体系,列出全世界最重要的葡萄育种单位。
  19. Jmeter线程组之 jp@gc - Stepping Thread Group (deprecated)
  20. 2021-08-29 UML笔记

热门文章

  1. 【一分钟论文】IJCAI2019 | Self-attentive Biaffine Dependency Parsing
  2. 全球计算机一起炼丹是怎样的体验?
  3. 从零实现深度学习框架——手写前馈网络实现电影评论分类
  4. Netty的并发编程实践5:不要依赖线程优先级
  5. 一条Select语句丛生到死的处理过程
  6. 《SEO实战密码》读后一点感受
  7. IT技术中的言情小说
  8. 3.1 RNN 循环神经网络 概述(下篇)
  9. 二分法04:猜数字大小
  10. Hadoop:Hadoop简介及环境配置