1、Java集合类(源码!!!HashMap、HashSet、HashTable、ConcurrentHashMap)。
2、线程安全,synchronized。
3、JVM的一系列命令。
4、数据库的索引、引擎、隔离级别、怎么查看死锁,共享锁排他锁,乐观锁。
5、Https为什么安全,流程是什么。
6、线程的状态,Thread的sleep方法,yield方法。
7、Java锁,完全不会系列。
思路部分源于面试后的查询。
1、一堆数字,其中有一个数字的数量超过了一半,找出这个数字。
思路:(1)遍历,哈希记录,没啥可说的。
(2)排序:找中位数。
(3)快速查找的思路:长度为n,如果所选数字的位置在n/2处,则为中位数,输出即可;如果其位置大于n/2,则在左边继续找,否则在右边继续找。
(4)根据数组的特点,很nice的思路:计数,首先从头开始,记录开始数字并记录次数,下一个数字如果重复则次数加一,不重复数字减一。如果次数为0了,重新记录下一次出现的数字,并记录其次数为1,继续计数。由于有一个数字出现的次数大于一半,遍历到最后的时候,剩下的只能是次数大于一半的那个数字。
2、一个数组,只有一个数字出现奇数次,其余数字出现偶数次,求出现奇数次的数字。
思路:异或,将所有数字进行异或,出现偶数次的数字异或结果为0,出现奇数次的数字x可以看作是偶数次+1次,其偶数次的异或结果为0,0异或剩下的一个x结果为x。
3、输出数字的全排列,比如:
输入:3
输出:
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
思路:递归,以3为例,可以看作是:第一个数字是1和其他两个数字的全排列+第一个数字是2和其他两个数字的全排列+第一个数字是3和其他两个数字的全排列。
代码:
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public ArrayList<int[]> result = new ArrayList<int[]>();
/*
* 数组的全排列
*/
public void allPerm(int[] nums, int start, int len) {
if(start >= len-1) {
// 也可以在此处直接输出
// System.out.println(Arrays.toString(nums));
result.add(nums.clone()); // 此处不能直接添加nums,如果是nums,添加就是nums的引用,可以去掉clone()看一下输出
return;
}
for(int i = start; i < len; i++) {
swap(nums, start, i); // 一次将元素放在开始的位置
allPerm(nums, start+1, len); // 递归
swap(nums, start, i); // 将元素放回原样,进行下一次遍历
}
}
/*
* 数组的两个位置的元素进行交换
*/
public void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
/*
* 用整数生成数组调用全排列
*/
public void useAllPerm(int n) {
int[] nums = new int[n];
for(int i = 1; i <= n; i++) {
nums[i-1] = i;
}
allPerm(nums, 0, n);
for(int i = 0; i < result.size(); i++) {
System.out.println(Arrays.toString(result.get(i)));
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Main test = new Main();
test.useAllPerm(4);
}
}