📅  最后修改于: 2023-12-03 14:45:38.719000             🧑  作者: Mango
Pratian Technologies 是一家技术服务提供商,总部位于印度班加罗尔。公司提供软件开发、测试、运维以及技术咨询等服务。其客户包括美国、欧洲、亚太等多个国家和地区的企业。
我进行的是初试,面试官主要询问了我对编程的认识、对算法的理解以及我之前做过的项目等。具体流程如下:
在面试过程中,面试官非常友善和耐心,提的问题也都很具体。
面试官提了一道编程题,要求我用Java实现,题目如下:
有一个数组,包含n个整数,其中一个整数出现了奇数次,其他整数都是偶数次,请写出一个函数,找出这个整数。
最开始我想到了暴力解法,遍历整个数组,记录每个数出现的次数,最后找到出现奇数次的整数。然后面试官问我是否有更优解,我又想到了用异或位运算解决。
public int findOddNum(int[] nums) {
int result = 0;
for (int i = 0; i < nums.length; i++) {
result ^= nums[i];
}
return result;
}
面试官提了一道算法题,要求我用Java实现,题目如下:
有一个01矩阵,求出其中最大全1子矩阵的面积。
我之前没有做过这个题,于是面试官给了我一些提示,比如可以将问题转化为求出每一行中每个元素的高度。(这个问题我后来发现是有效的,可以参考这篇文章。)最后我写出了代码:
public int maxRectangle(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return 0;
}
int[] heights = new int[matrix[0].length];
int maxArea = 0;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
heights[j] = matrix[i][j] == 0 ? 0 : heights[j] + 1;
}
maxArea = Math.max(maxArea, largestRectangleArea(heights));
}
return maxArea;
}
private int largestRectangleArea(int[] heights) {
if (heights == null || heights.length == 0) {
return 0;
}
int maxArea = 0;
Stack<Integer> stack = new Stack<>();
for (int i = 0; i <= heights.length; i++) {
int h = i == heights.length ? 0 : heights[i];
while (!stack.isEmpty() && h < heights[stack.peek()]) {
int top = stack.pop();
maxArea = Math.max(maxArea, heights[top] * (stack.isEmpty() ? i : i - stack.peek() - 1));
}
stack.push(i);
}
return maxArea;
}
这次面试经历让我受益匪浅,不仅学到了一些新的算法,也巩固了编程基本知识。同时,我也感受到了 Pratian Technologies 对技术人才的重视和尊重,面试过程中始终保持着良好的态度和沟通。