最近面试一家国内外卖NO.1的互联网公司,总共手写了五道题,现将其记录下来。
1.从一个数组中找出满足符合条件的元素:它大于或等于前面所有元素,小于或等于后面所有元素。(这道题当时用很蠢的方法写的,没得什么技术含量,后来回来才去网上看了一下好的方式)
* 1.一个用来记录最大值的数组
* 2.一个用来记录最小值的数组
* 3.一个用来记录结果的数组(使用集合更方便)
* * 比如有如下的一个序列:
* 1 3 2 4 7 4 3 5
* "一个用来记录最大值的数组"的意思是,遍历到当前位置时,直至该处的最大值
* 1 3 3 4 7 7 7 7 -> max[]
* "一个用来记录最小值的数组"的意思是,遍历到当前位置时,直至该处的最小值(反向遍历)
* 1 2 2 3 3 3 3 5 -> min[]
* 【面试 - 几道编程题】 * 结果数组(集合)存放的是,大于等于max[]数组,小于等于min[]数组的元素
*/public class FindNumber {public static ArrayList find(int[] array) {//使用集合来保存符合条件的数
ArrayList result = new ArrayList<>();
int[] max = new int[array.length];
//定义一个存放最大值的数组
int[] min = new int[array.length];
//定义一个存放最小值的数组//先填充max[]和min[]数组
for (int i = 0;
i < array.length;
i++) {
max[i] = array[i];
min[i] = array[i];
}//将max[]数组调整为符合条件的数组
for (int i = 1;
i < array.length - 1;
i++) {
if (max[i] < max[i + 1]) {
max[i] = max[i + 1];
}
}
//将min[]数组调整为符合条件的数组
for (int j = array.length - 1;
j > 0;
j--) {
if (min[j] < min[j - 1]) {
min[j - 1] = min[j];
}
}//进行比较,输出满足条件的结果集合
for (int i = 0;
i < array.length;
i++) {
if (array[i] >= max[i] && array[i] <= min[i]) {
result.add(array[i]);
}
}return result;
}//测试方法
public static void main(String[] args) {
int[] array = {1, 3, 2, 4, 7, 4, 3, 5};
System.out.println(find(array));
}}
2.写一个死锁。
public class DeadLock {
private static Object object1 = new Object();
private static Object object2 = new Object();
public static void main(String[] args) {DeadLock deadLock = new DeadLock();
new Thread(deadLock.new Thread1()).start();
new Thread(deadLock.new Thread2()).start();
}class Thread1 implements Runnable {
@Override
public void run() {
synchronized (object1) {
System.out.println("get lock1");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}synchronized (object2) {
System.out.println("get lock 2");
}
}
}
}class Thread2 implements Runnable {
@Override
public void run() {
synchronized (object2) {
System.out.println("get lock2");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}synchronized (object1) {
System.out.println("get lock 1");
}
}
}
}}
3.跳台阶。(这是剑指offer上的一道题,只用一行代码就写出来了)
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
public class Solution
{
public int JumpFloorII(int target)
{//除了最后一个台阶,每个台阶都有两种选择,跳或者不跳,但是最后一个台阶必须跳return (int)Math.pow(2,target-1);
}
}
4.二分查找。这个是基础了,以前也写过。
public class BinarySearch
{
public int getPos(int[] array, int n, int value)
{
int result = -1;
int position = 0;
int left = 0;
int right = n;
position = (left + right) / 2;
while (position >= left && position <= right)
{
if (array[position] > value)
{
right = position;
position = (left + right) / 2;
}else if (array[position] < value)
{
left = position;
position = (left + right) / 2;
} else
{
result = position;
for (int i = 0;
i <= position;
i++)
{
if (array[position - i] == value)
result = position - i;
else
return result;
}return result;
}
}return result;
}
}
5.求一棵树的最大连通子节点的个数(求树宽度)。
我是这样想的,先求出左子树的高度,再求出右子树的高度,将两个高度相加再减去1(因为根结点加了两次),就是树的宽度了。(如有不对之处,请及时指正)
class TreeNode {
int value;
TreeNode left = null;
TreeNode right = null;
TreeNode(int value) {
this.value = https://www.it610.com/article/value;
}
}public class TreeWidth {public static int treeWidth(TreeNode root) {
if (root == null) {
return 0;
}
int leftWidth = treeWidth(root.left);
int rightWidth = treeWidth(root.right);
int width = leftWidth + rightWidth - 1;
return width;
}}
推荐阅读
- InnoDB索引优化
- 使用Java8新增的Predicate操作集合
- 实现事件监听器对象的几种形式()
- Reference counted Objects (引用计数对象) - 文章翻译
- 面试-编程题
- 处理Blob类型数据()
- java|面试官想问的Java问题,都在这篇文章中了!