字节跳动 Java一面面经

字节跳动Java一面面经

  • 知识点
  • 算法题

实在是自己太沉,跳不动啊
时间:2019.08.19

知识点

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);
	}
}

你可能感兴趣的:(面经)