1.线程安全的单例模式

//饿汉式  线程安全的
class danlie1 {private danlie1(){}private static danlie1 d=new danlie1();public static danlie1 get(){return d;}
}
//懒汉式  线程不安全
class Single {private Single(){}private static Single d=null;public static Single get(){if(d==null) d=new Single();return d;}
}
class Single2 {private Single2(){}private volatile static Single2 d;public static Single2 get(){if(d==null){synchronized (Single2.class){if(d==null){d=new Single2();}}}return d;}
}
class Sing3{private Sing3(){}private static class rrr{private static Sing3 sa=new Sing3();}public static Sing3 get(){return rrr.sa;}
}
enum ddd{Instance;
}

2.循环打印ABC

    public static void main(String[] args) {ExecutorService executorService = Executors.newSingleThreadExecutor();Runnable a = new Runnable() {@Overridepublic void run() {System.out.println("A");executorService.execute(this::run);}};Runnable b = new Runnable() {@Overridepublic void run() {System.out.println("B");executorService.execute(this::run);}};Runnable c = new Runnable() {@Overridepublic void run() {System.out.println("C");executorService.execute(this::run);}};executorService.execute(a);executorService.execute(b);executorService.execute(c);}

3.微信扫码登录

4.不使用临时变量实现swap

        a=a^b;b=a^b;a=a^b;a=b-a;b=b-a;a=b+a;

5.十进制转十六进制

    public String toHex(int num) {if (num == 0) return "0";char[] chars = new char[]{'0','1','2','3','4','5','6','7','8','9','a', 'b', 'c', 'd', 'e', 'f'};StringBuffer buffer = new StringBuffer();int temp;while (num != 0) {temp = num & 15;buffer.insert(0, chars[temp]);num >>>= 4;}return buffer.toString();}

6.翻转链表

class Solution {public ListNode reverseList(ListNode head) {ListNode pre=null;ListNode curr=head;while(curr!=null){ListNode next=curr.next;curr.next=pre;pre=curr;curr=next;}return pre;}
}

7.快排

3 种快排基准选择方法:
随机(rand函数)、固定(队首、队尾)、三数取中(队首、队中和队尾的中间数)

4种优化方式:
优化1:当待排序序列的长度分割到一定大小后,使用插入排序
优化2:在一次分割结束后,可以把与Key相等的元素聚在一起,继续下次分割时,不用再对与key相等元素分割
优化3:优化递归操作
优化4:使用并行或多线程处理子序列

8.top K问题

  1. 直接排序(适用于数据量小的情况下)
  2. 快速排序的变形 (只使用于内存够的情况)
    (1)这种方法类似于快速排序,首先选择一个划分元,将比这个划分元大的元素放到它的前面,比划分元小的元素放到它的后面,此时完成了一趟排序。
    (2)如果此时这个划分元的序号index刚好等于K,那么这个划分元以及它左边的数,刚好就是前K个最大的元素;如果index > K,那么前K大的数据在index的左边,那么就继续递归的从index-1个数中进行一趟排序;如果index < K,那么再从划分元的右边继续进行排序,直到找到序号index刚好等于K为止。再将前K个数进行排序后,返回Top K个元素。这种方法就避免了对除了Top K个元素以外的数据进行排序所带来的不必要的开销。
  3. 最小堆法
    这是一种局部淘汰法。先读取前K个数,建立一个最小堆。然后将剩余的所有数字依次与最小堆的堆顶进行比较,如果小于或等于堆顶数据,则继续比较下一个;否则,删除堆顶元素,并将新数据插入堆中,重新调整最小堆。当遍历完全部数据后,最小堆中的数据即为最大的K个数。
  4. 分治法
    将全部数据分成N份,前提是每份的数据都可以读到内存中进行处理,找到每份数据中最大的K个数。此时剩下NK个数据,如果内存不能容纳NK个数据,则再继续分治处理,分成M份,找出每份数据中最大的K个数,如果M*K个数仍然不能读到内存中,则继续分治处理。直到剩余的数可以读入内存中,那么可以对这些数使用快速排序的变形或者归并排序进行处理。
  5. Hash法
    如果这些数据中有很多重复的数据,可以先通过hash法,把重复的数去掉。这样如果重复率很高的话,会减少很大的内存用量,从而缩小运算空间。处理后的数据如果能够读入内存,则可以直接排序;否则可以使用分治法或者最小堆法来处理数据。

9.8G的int型数据,计算机的内存只有2G,怎么对它进行排序?(外部排序)(百度一面)

添加链接描述
我们可以使用外部排序来对它进行处理。首先将整个文件分成许多份,比如说m份,划分的依据就是使得每一份的大小都能放到内存里。然后我们用快速排序或者堆排序等方法对每一份数据进行一个内部排序,变成有序子串。接着对这m份有序子串进行m路归并排序。取这m份数据的最小元素,进行排序,输出排序后最小的元素到结果中,同时从该元素所在子串中读入一个元素,直到所有数据都被输出到结果中为止。

10.数组 树化

class TreeNode1{private int val;TreeNode1 left;TreeNode1 right;public TreeNode1(){}public TreeNode1(int val){this.val=val;}TreeNode1 vec2tree(int[] nums,int idx){TreeNode1 root;if(Integer.valueOf(nums[idx])==null){root=null;idx++;}else{root=new TreeNode1(nums[idx]);idx++;root.left=vec2tree(nums,idx);root.right=vec2tree(nums,idx);}return root;}
}

11.n个骰子出现和为m的概率

int getNSumCount(int n, int sum)
{if(n<1||sum<n||sum>6*n){return 0;}if(n==1){return  1;}int resCount=0;resCount=getNSumCount(n-1,sum-1)+getNSumCount(n-1,sum-2)+getNSumCount(n-1,sum-3)+getNSumCount(n-1,sum-4)+getNSumCount(n-1,sum-5)+getNSumCount(n-1,sum-6);return resCount;
}
class Solution {public double[] dicesProbability(int n) {double[] dp = new double[6];Arrays.fill(dp, 1.0 / 6.0);for (int i = 2; i <= n; i++) {double[] tmp = new double[5 * i + 1];for (int j = 0; j < dp.length; j++) {for (int k = 0; k < 6; k++) {tmp[j + k] += dp[j] / 6.0;}}dp = tmp;}return dp;}
}

12.迪杰斯特拉

public class DijkstraAlgorithm {public static void main(String[] args) {char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };// 邻接矩阵int[][] matrix = new int[vertex.length][vertex.length];final int N = 65535;// 表示不可以连接matrix[0] = new int[] { N, 5, 7, N, N, N, 2 };matrix[1] = new int[] { 5, N, N, 9, N, N, 3 };matrix[2] = new int[] { 7, N, N, N, 8, N, N };matrix[3] = new int[] { N, 9, N, N, N, 4, N };matrix[4] = new int[] { N, N, 8, N, N, 5, 4 };matrix[5] = new int[] { N, N, N, 4, 5, N, 6 };matrix[6] = new int[] { 2, 3, N, N, 4, 6, N };DJS D=new DJS();int[] dsj = D.dsj(matrix, 6);System.out.println(Arrays.toString(dsj));}
}
class DJS{private int[] already_arr;private int[] pre_visited;private int[] dis;public int[] dsj(int[][] nums, int index) {int length=nums.length;this.already_arr = new int[length];this.pre_visited = new int[length];this.dis = new int[length];// 初始化 dis数组Arrays.fill(dis, 65535);this.dis[index] = 0;// 设置出发顶点的访问距离为0this.already_arr[index] = 1; // 设置出发顶点被访问过update(nums,index);// 更新index顶点到周围顶点的距离和前驱顶点for (int j = 1; j < nums.length; j++) {int idx = findNextStartPoint();// 选择并返回新的访问顶点update(nums,idx); // 更新index顶点到周围顶点的距离和前驱顶点}return dis;}// 更新index下标顶点到周围顶点的距离和周围顶点的前驱顶点,private void update(int[][] nums, int index) {int len = 0;// 根据遍历我们的邻接矩阵的 matrix[index]行for (int j = 0; j < nums[index].length; j++) {// len 含义是 : 出发顶点到index顶点的距离 + 从index顶点到j顶点的距离的和len = dis[index] + nums[index][j];// 如果j顶点没有被访问过,并且 len 小于出发顶点到j顶点的距离,就需要更新if (!(already_arr[j]==1) && len < dis[j] ) {pre_visited[j]=index;// 更新j顶点的前驱为index顶点dis[j]=len;         // 更新出发顶点到j顶点的距离}}}public int findNextStartPoint() {int min = 65535, index = 0;for (int i = 0; i < already_arr.length; i++) {if (already_arr[i] == 0 && dis[i] < min) {min = dis[i];index = i;}}// 更新 index 顶点被访问过already_arr[index] = 1;return index;}
}

java面试之常见场景题相关推荐

  1. java面试技术问题_11个JAVA面试中常见技术问题

    原标题:11个JAVA面试中常见技术问题 大家在平常面试java的过程中都会遇到哪些难题呢?还有一些即将去面试java的童鞋们,你们想知道技术面试中会涉及到哪些点吗?达妹为你整理Java面试中会被问到 ...

  2. Java面试中常见的高并发解决方案

    Java面试中常见的高并发解决方案 一般来讲,提高系统应对高并发能力的解决方案可以从以下几个方面入手: (1)高性能服务器 (2)高性能数据库 (3)高效编程语言 (4)高性能web容器 提高数据库性 ...

  3. 50分钟的Java面试,常见的问题都问到了

    面试的话题总是很热门,特别是关于大厂的面试,而事实只有极少的程序员能够进入大厂,更多的是普通的中小企业,当然还有一类争议很多的外包公司,这些普通的中小企业的面试和大厂的风格其实差别还是很大的,这类面试 ...

  4. 如何短时间突击 Java面试?附刷题神器

    你是不是正在找工作,或正准备找工作?是不是没有太多时间准备面试?该如何做呢? 划重点:如果时间有限,能做的就是多加温习并巩固自己的理论知识,临时磨刀不快也会发光!!! 从今年大家找工作反馈的情况来看, ...

  5. 金三银四跳槽季,java面试突击(100题)进大厂就这么简单

    1.谈谈对面向对象思想的理解 首先,谈谈"面向过程"vs"面向对象" 我觉得这两者是思考角度的差异,面向过程更多是以"执行者"的角度来思考问 ...

  6. java面试之每天五题

    这里写目录标题 SpringBoot的运行机制是怎么样的? Mybatis的二级缓存怎么开启? redis缓存穿透,缓存血崩,缓存击穿怎么解决? SpringCloud里面的组件用过那些呢? 负载均衡 ...

  7. java面试突击(100题)进大厂就这么简单

    1.谈谈对面向对象思想的理解 首先,谈谈"面向过程"vs"面向对象" 我觉得这两者是思考角度的差异,面向过程更多是以"执行者"的角度来思考问 ...

  8. JAVA面试208道实用题,答案持续更新整理。

    一.JAVA基础 1. JDK 和 JRE 有什么区别? JRE(java Runtime Environment)是java运行时环境,包含了java虚拟机,java基础类库,是java语言编写的程 ...

  9. java面试时候算法题多吗,Java面试必问算法题

    面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min()的栈,要 ...

最新文章

  1. 向IIS注册ASP.NET代码
  2. Ubuntu vi 上下左右变ABCD问题解决方法
  3. Docker-数据管理
  4. [PAT乙级]1019 数字黑洞
  5. linux文件基础知识,linux文件系统基础知识
  6. 【转】DICOM医学图像处理:基于DCMTK工具包学习和分析worklist
  7. 平安夜、圣诞节设计素材和灵感|撒糖(PNG免扣素材)
  8. SQL ---- 查询字段为逗号拼接的字符串
  9. Python函数声明以及与其他编程语言数据类型的比较
  10. 40行代码自己动手写pdf转word小工具(文末附工具下载)
  11. 用Interl 5100AGN 无线网卡破解无线网络WEP密码
  12. 西瓜综艺走进厦门大同小学 唤醒家庭亲子交流
  13. 滇池学院计算机基础,云南大学滇池学院网络服务系统 云南大学滇池学院
  14. 洛谷P3224【HNOI2012】永无乡
  15. Duilib 和 DuiDesigner 简介
  16. Lync 2013兼容性
  17. 你好, View Binding! 再次再见, findViewById!
  18. 【渝粤教育】电大中专计算机职业素养 (3)作业 题库
  19. python中callable什么意思_python中callable对象有什么用
  20. 浅析深究什么是SOA?

热门文章

  1. 乐视盒子服务器有响应,乐视盒子卡顿这样做快速搞定,这几个方法你要学会
  2. 在html中设置外边距,CSS外边距设置属性margin用法
  3. 注册页面html版本
  4. 从深度心理学的角度看爱情
  5. 你还戴着有色眼镜看戴尔科技集团吗?
  6. 【数据可视化】 D3+ArcGIS 迁徙图实现
  7. D3.js 使用geojson绘制地图
  8. 简单介绍js中的confirm()方法的使用
  9. 属性-Yii 基础-深入理解YII2.0(1.1)
  10. 地下城与勇士体验服不显示服务器,地下城与勇士M手游体验服进不去怎么办?内测问题与解决方案汇总[多图]...