Moonfrog Labs 面试经历 |设置 3
Q1。给定一个整数序列,找出最长的递增子序列。例子:
arr = [1, 2, 5, 3, 7]
答案: [1, 2, 5, 7] 或 [1, 2, 3, 7]
arr = [4, 3, 1, 2]
答案:[1, 2]。
解决方案:
import java.util.Arrays;
/** @author hiccup */
class LIS
{
static int[] maxLIS;
static int[] result;
public static void getLCS(int[] arr)
{
if (null == arr || 0 == arr.length)
return;
maxLIS = new int[arr.length];
/* At least LCS is 1 i.e. element is the
only one in given sequence */
Arrays.fill(maxLIS, 1);
/**
*
*/
for (int curIdx = 1; curIdx < arr.length; curIdx++)
{
for (int beginIdx = 0; beginIdx <= curIdx - 1; beginIdx++)
{
if (arr[curIdx] > arr[beginIdx])
{
if (maxLIS[curIdx] < maxLIS[beginIdx] + 1)
{
//System.out.print(arr[curIdx] + " ");
maxLIS[curIdx] = maxLIS[beginIdx] + 1;
}
}
}
}
int max = maxLIS[0];
result = new int[arr.length];
Arrays.fill(result, -1);
int cpIdx = 0;
for (int idx = 0; idx < maxLIS.length; idx++)
{
/* Put sequence at cpIdx */
if (-1 == result[maxLIS[idx] - 1])
{
result[cpIdx++] = arr[idx];
}
}
/* Print sequence */
for (int idx = 0; idx < result.length; idx++)
{
System.out.print(result[idx] + " ");
}
}
public static void main(String[] args)
{
int[] arr = {1, 2, 5, 3, 7};
LIS.getLCS(arr);
}
}
[1、2、3、3、4]
—————————————————————————————————————————————————
Q2。给定一个固定长度的数字向量,例如:
v1 = [4, 3, 1, 2] v2 = [2, 4, 3, 5]
嵌套在两个向量之间的关系定义如下:
如果一个向量的对应项都小于另一个向量,如果需要重新排列向量的项后,则第一个向量
据说嵌套在other中。例子
未嵌套
v1 – [4, 3, 1, 2] v2 – [2, 4, 3, 5]
v2 – [2, 4, 3, 5] v1 – [4, 3, 1, 2]
重新整理后:
嵌套
v1 – [4, 3, 1, 2]
v2 – [5, 4, 2, 3]
因此 v1 嵌套在 v2 中。
给定一对这样的向量 ,编写如下函数:
函数isNested(Vec a, Vec b);
结果:
-1 如果 a 嵌套在 b 中
1 如果 b 嵌套在 a
如果无法嵌套,则为 0。
————————————————————————————————————————————
Q3。给定一个随机顺序的数字列表。是否可以以没有两对共享一个元素的方式对列表中的所有元素进行配对
并且一对元素的总和可以被 101 整除。例如:
v1 [ 1, 100, 1]
答:没有
v2 [1, 100, 100, 1] [2, 98, 101, 1]
答:是的
v3 [1, 200, 100, 100, 2, 1]
答:是的