9.20 58同城笔试




单选15,多选5,编程题三个
第一道61%,第二道100%,第三道边界条件没处理好没过



● 第一道找两个数组的交集,[[1,2],[4,6]]和[[2,3],[5,6]]的交集为[[2,2],[5,6]]。思路:用一个额外的数据记录,遍历第一个若是范围内的就加1,第二个数组也同理。最后数组中值为2的就是交集。


● 第二道将一个字符串切割成两个非空字符串,左边a的数量加上右边b的数量的最大值。思路:先统计所有a,b的数量,边遍历字符串边统计此时ab的数量,切割i后面的位置,maxNum = Math.max(maxNum, aCur + bTotal - bCur);



● 第三道在一个无限长的数轴上,1,2,3表示从1走到2恰好走3步有几种方式。思路:使用动态规划,dp[i][j]表示间隔为i走j步有几种方式,dp[i][j] = Math.max(dp[i][j], dp[i + 1][j - 1] + dp[i - 1][j - 1]); 因为这里用到了i+1所以创建的时候int[][] dp = new int[dis + 3][k + 1];是距离加3,遍历的时候也要为i < dp.length - 1,否则会数组越界。

#你都收到了哪些公司的感谢信?##我的实习求职记录##互联网没坑了,还能去哪里?##如何判断面试是否凉了##在找工作求抱抱#
全部评论
public int[][] findIntersection(int[][] firstList, int[][] secondList) { // write code here if (firstList == null || secondList == null) { return null; } if (firstList.length == 0 || secondList.length == 0) { return new int[][]{}; } int size = Math.max(firstList[firstList.length - 1][1], secondList[secondList.length - 1][1]); int[] array = new int[size + 1]; for (int i = 0; i < firstList.length; i++) { for (int j = firstList[i][0]; j <= firstList[i][1]; j++) { array[j]++; } } for (int i = 0; i < secondList.length; i++) { for (int j = secondList[i][0]; j <= secondList[i][1]; j++) { array[j]++; } } List<int> list = new ArrayList<>(); for (int i = 0; i < array.length; i++) { if (array[i] == 2) { int j = i + 1; while (j < array.length && array[j] == 2) { j++; } list.add(new int[]{i, j - 1}); i = j; } } int[][] res = new int[list.size()][2]; for (int i = 0; i < res.length; i++) { res[i] = list.get(i); } return res; } public int StringSplit(String str) { // write code here // 先统计出总的a和b的数量,然后移动指针看在某个位置切割左a加右b的最大数量 int maxNum = 0; int aTotal = 0, bTotal = 0; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == 'a') { aTotal++; } else if (str.charAt(i) == 'b') { bTotal++; } } // 在i后面的位置切割 int aCur = 0, bCur = 0; for (int i = 0; i < str.length() - 1; i++) { if (str.charAt(i) == 'a') { aCur++; } else if (str.charAt(i) == 'b') { bCur++; } maxNum = Math.max(maxNum, aCur + bTotal - bCur); } return maxNum; } public static void main(String[] args) { int i = numberOfWays(1, 2, 3); System.out.println(i); } public static int numberOfWays(int startPos, int endPos, int k) { // write code here // dp[i][j]表示间隔为i走j步有几种方式 int dis = endPos - startPos; int[][] dp = new int[dis + 3][k + 1]; for (int i = 0; i < dp.length; i++) { dp[i] = new int[k + 1]; } for (int j = 0; j < dp[0].length; j++) { if (j % 2 == 0) { dp[0][j] = j; } } dp[0][0] = 1; for (int j = 1; j < dp[0].length; j++) { for (int i = 1; i < dp.length - 1; i++) { dp[i][j] = Math.max(dp[i][j], dp[i + 1][j - 1] + dp[i - 1][j - 1]); } } // System.out.println(Arrays.deepToString(dp)); return dp[dis][k]; }</int>
1 回复 分享
发布于 09-20 20:51 浙江
第一题直接两层循环,left取左边界最大值,右边界去最小值,左边界<=右边界就加到ans。后来还想merge一下可能重合的边界,结果直接全过了
1 回复 分享
发布于 09-20 20:58 北京
第三个return 0
点赞 回复 分享
发布于 09-20 20:56 白俄罗斯
第三道没过?直接return0过一半,看见都傻眼了,直接下一题,反倒是第一题思路绕道力扣上了就应该直接暴力解的
点赞 回复 分享
发布于 09-20 20:56 辽宁
佬,题一样,顺序变了下,我的1是找公共区间,2是分割字符串,3是反复横跳,1.0 0.7 0.51,不知道能不能进面,应该主要还是看学历,寄
点赞 回复 分享
发布于 09-20 20:56 上海
哥们,我笑了,第一题写的和我一模一样,过61%,我在最后3分钟才发现什么问题,[1,2][3,4]和[2,3]结果是[2,2][3,3],而不是[2,3],服了。这在题目第二个例子中已经表明了,可我看完第一个例子就直接写了,这就是不看例子的下场,最后三分钟也改不了只能放弃
点赞 回复 分享
发布于 09-20 21:01 江苏
前两题直接暴力,第三题我看着好像有数学规律求一个C(m,n),有除法,不能取余,估计溢出了,只过了56
点赞 回复 分享
发布于 09-20 21:06 湖南
只有我觉得选择题也不好选择吗,我做了好久😅
点赞 回复 分享
发布于 09-20 21:25 河南
我第1道a0.69,第2道a1,第3道 a0.51。
点赞 回复 分享
发布于 09-21 15:13 四川
第一题就把两个数组[{},{}],[{},{}]合并成一个二维数组,然后对【】【0】进行排序,剩下就按照题目的规则来
点赞 回复 分享
发布于 09-22 17:22 浙江

相关推荐

1 1 评论
分享
牛客网
牛客企业服务