2019多益笔试编程和面试的算法题

  • 多益网络笔试编程题:字符串的指定位数组合
    • 原题概述(只记得大概):
    • 题目解答
  • 多益网络面试算法题:不用比较找出两数中的较大值和较小值
    • 原题概述:
    • 题目解答
  • 代码示例:

多益的笔试题中只有一道编程题,难度中等,是《剑指offer》中的题目的变形,只要稍微认真读一下题目和看过题目的原型的话,做出来应该不会太难.

不过它给的时间有点少,我记得我当时做到编程的时候大概还有20分钟左右剩下,然后看了一下题目,一下子想不出来,就回去做了前面的题目,再回来做,就忽然记起来的,但是没有剩下多少时间了,只能写个解题思路就交了。当时没想到能过笔试,毕竟编程题都没有做出来。然后迷迷糊糊就进了面试。

面试前查了一下多益网络的面试流程之类的,发现只会有一次面试(当时看到时真不敢相信),而且是视频面试,当晚就有点紧张和兴奋了,毕竟这是第三次做笔试,才进面试了。面试面经就不说了,网上很多,而且自己应该没有过(面试中算法题答不上)

接下来进入正题吧,就想记录一下多益网络的笔试编程题和面试时遇到算法题,觉得出得挺好的。

多益网络笔试编程题:字符串的指定位数组合

原题概述(只记得大概):

找出数字字符串中指定位数的最小值。组合在原来字符串中的前后顺序不能变。

例如:有字符串"1230451",要求找出两位最小的顺序组合,则结果是1(是01的组合).

有字符串"123451",要求找出两位最小的顺序组合,则结果是11.

题目解答

原型应该是《剑指offer》中的面试题28:字符串的排序中的拓展:

如果输入n个字符,则这n个字符能构成长度为1的组合、长度为2的组合、。。、长度为n的组合。求n个字符的所有的组合(所有长度)。答案

多益的这道题本质上跟《剑指offer》中的没有太大区别,只是加了一下字符串转整数之类的过程。

核心解题思路还是字符串的m位组合数,就是将字符串组合分为两部分:

第一个字符和其余的所有字符。如果组合里包含第一个字符,则下一步在所剩余的n-1个字符里选取m个字符。如果组合里不包含第一个字符,则下一步在剩余的n-1个字符里选取m个字符。也就是说,我们可以把n个字符组成长度为m的组合问题分解为两个子问题,分别求n-1个字符串中长度为m-1的组合,以及求n-1个字符的长度为m的组合。这两个子问题都可以用递归的方式解决。

具体见下方代码:

多益网络面试算法题:不用比较找出两数中的较大值和较小值

原题概述:

不用比较,找出两数中的较大值和较小值。(后来面试官有提示使用加减乘除,但是我还是想不出来,因为之前没有做过这道题,虽然这道题看起来很熟悉,有时候真的需要多做算法题,没看过的题目,硬想是很难在短时间内想到)

题目解答

面试完之后,我百度了一下解答,原来是要自己定义sign函数(即利用>>>31位获取得到某个数是正数还是负数),然后可以利用sign(a-b)就可以知道,如果a大于b,则运算结果是1。如果是b大,则运算结果是0。然后还可以利用异否^1,定义flip函数,得到1的否定0,0的否定1。

这样就可以通过上面的结果乘以两数本身然后相加,如果一个的系数为0,则另一个数的为1,和则系数为1的那个数。这样可以决定返回大小值了。

其中尤其值得注意的是,还需要考虑a-b的值可能会溢出,这时候就不单单至以上说得那么简单了,还需要考虑a和b的两个数之间的正负值

参考:https://blog.csdn.net/jeanphorn/article/details/42264537
https://blog.csdn.net/u010456903/article/details/48953429

具体见下方代码:

代码示例:

import java.util.Stack;/*** 多益的编程题和面试时的编程题** @author zhangcanlong* @date 2019年1月12日*/
public class DuoyiTest {public static void main(String[] args) {DuoyiTest test = new DuoyiTest();// 测试1System.out.println("测试1都是正数");test.findTwoNumMinAndMax(1, 100);// 测试2System.out.println("测试2,a负,b正");test.findTwoNumMinAndMax(-13, 100);// 测试3System.out.println("测试3");test.findTwoNumMinAndMax(-13, -48);// 测试4(溢出情况)System.out.println("测试4(溢出情况)");test.findTwoNumMinAndMax(-2147483647, 2000000);// 找出数字字符串中指定位数的最小值测试1System.out.println("找出数字字符串中指定位数的最小值测试1:" + test.findMinNum("123450231", 2));// 找出数字字符串中指定位数的最小值测试2System.out.println("找出数字字符串中指定位数的最小值测试2:" + test.findMinNum("234523", 2));// 找出数字字符串中指定位数的最小值测试3System.out.println("找出数字字符串中指定位数的最小值测试3:" + test.findMinNum("12345231", 5));// 找出数字字符串中指定位数的最小值测试4System.out.println("找出数字字符串中指定位数的最小值测试4:" + test.findMinNum("12345231", 6));}/*** 找出数字字符串中指定位数的最小值,例如:有字符串"1230451",要求找出两位最小的顺序组合,则结果是01,即1.* <p>* 解题思路:将其转化为从长度为n的数字数组中找出m位组合即可** @param str*            要寻找的字符串* @param m*            指定的位数*/public Integer findMinNum(String str, int m) {if (str == null || str.length() <= 1 || m >= str.length()) {if (str == null) {throw new RuntimeException("字符串不能为空");}return Integer.parseInt(str);}int[] ints = new int[str.length()];for (int i = 0; i < str.length(); i++) {ints[i] = Integer.parseInt(String.valueOf(str.charAt(i)));}Stack<Integer> stack = new Stack<>();Integer[] mins = new Integer[1];combinateNum(ints, 0, m, stack, mins);return mins[0];}/*** 求数组的m位组合,递归方法** @param ints 要求的数组 * @param start 开始求组合的元素下标* @param combinateDigit 要求的组合数* @param stack 存放一次组合的结果* @param mins 存放m个字符值的最小值,即最终结果*/private void combinateNum(int[] ints, int start, int combinateDigit, Stack<Integer> stack, Integer[] mins) {if (combinateDigit <= 0) {// 遍历获取栈,求得拼接的值的大小(这里不考虑大数范围)int tempMin = 0;for (int i = 0; i < stack.size(); i++) {tempMin = tempMin + ((int) Math.pow(10, stack.size() - i - 1)) * stack.get(i);// System.out.print(stack.get(i) + " ");}// System.out.println();// 重新赋值最小值if (mins[0] == null || mins[0] > tempMin) {mins[0] = tempMin;}return;}if (start > ints.length - 1) {return;}stack.push(ints[start]);combinateNum(ints, start + 1, combinateDigit - 1, stack, mins);stack.pop();combinateNum(ints, start + 1, combinateDigit, stack, mins);}/*** 不用比较,找出两个数中最大的和最小的(不考虑溢出情况)*/public void findTwoNumMinAndMax(int a, int b) {int signA = sign(a - b);int signB = flip(signA);System.out.println("较大的数为:" + (signA * a + signB * b));System.out.println("较小的数为:" + (signB * a + signA * b));}/*** 取相反的数,如果是1,则返回0,如果是0,则返回1*/private int flip(int n) {return n ^ 1;}/*** 判断某个数的符号** @param n*            要判断的数* @return 如果是正数,返回1,如果是负数返回0*/private int sign(int n) {return (n >>> 31) ^ 1;}
}

2019多益笔试编程和面试的算法题相关推荐

  1. 快手2019春招笔试编程题

    快手2019春招笔试编程题 第一题 输入描述 输出描述 分析 代码 第二题 输入描述 输出描述 分析 代码 第三题 输入描述 输出描述 分析 代码 个人主页:http://redtongue.cn o ...

  2. 语言高精度算法阶乘_JavaScript中的算法(附10道面试常见算法题解决方法和思路)...

    https://juejin.im/post/6844903811505455118 Introduction 面试过程通常从最初的电话面试开始,然后是现场面试,检查编程技能和文化契合度.几乎毫无例外 ...

  3. 面试高频算法题补充系列:如何判断一个点是否在三角形内?

    前言 了解更多常考高频算法题可以关注 公众号:一个搬砖的胖子 企业面试题库:https://codetop.cc/ 小程序:CodeTop 该题曾出现在字节跳动.腾讯.网易.美团.小马智行等公司的面试 ...

  4. 面试经典算法题集锦——《剑指 offer》小结

    本文转载自: http://www.cnblogs.com/fanling999/p/7810558.html 作者:fanling999 转载请注明该声明. 从今年 3 月份开始准备找实习,到现在校 ...

  5. 面试时算法题的解答思路

    面试中纯粹考算法的问题一般是让很多程序员朋友痛恨的,这里分享下我对于解答算法题的一些思路和技巧. 一般关于算法的文章,都是从经典算法讲起,一种一种算法介绍,见得算法多了,自然就有了感悟,但如此学习花费 ...

  6. 面试高频算法题补充系列:木棍切割问题

    前言 了解更多常考高频算法题可以关注 公众号:一个搬砖的胖子 高频算法网站:https://codetop.cc/ 小程序:CodeTop 此题经常在字节跳动后端面试中遇到,尤其是教育部门的三面.我押 ...

  7. 2019年度国考笔试放榜 面试名单将向统一社会公布

    中新网客户端北京1月18日电(冷昊阳)18日,2019年度国家公务员考试笔试成绩和分数线公布,考生可在国家公务员局网站查询.据介绍,国家公务员局将根据各职位规定的面试比例,按照笔试成绩从高到低的顺序, ...

  8. 商汤科技 2019校园招聘笔试编程题-2018.09.07

    本来阿里和商汤冲突了,就放弃了阿里的劝退型笔试,结果,商汤也劝退,只发一下题目做参考吧!知道题解的同学可以在评论区粘上链接,我会随时更新并加以感谢的.

  9. 滴滴 2019校园招聘笔试编程题-2018.09.18

    输入: slep slap sleep step shoe shop snap slep 输出: slep slap step 代码是交卷后写出来的,没有经过测试,不知道是否能够AC 利用DP求出每个 ...

最新文章

  1. R语言广义线性模型泊松回归(Poisson Regression)模型
  2. 牛X,一系列Chrome 灵魂插件!爱了爱了!
  3. 从R-CNN到Mask R-CNN
  4. HTTP VS RPC
  5. JobDataMap传递参数_02
  6. bootstrap-table全选当前页所有数据checkAll
  7. 20165236 2017-2018-2 《Java程序设计》结对编程练习_四则运算
  8. ASP.NET命名空间参考手册—C#编程篇
  9. web`2019.2.28~MY g~
  10. 【原】oracle external table
  11. 优秀的项目经理都会用这60个项目管理工具模板,可直接编辑套用
  12. 悲催的一下午:怎么删除360。。。
  13. WordPress直接调用头像地址
  14. Homography单应性矩阵原理
  15. sklearn_scaler
  16. 蓝桥杯 算法训练 一元三次方程求解
  17. C++——动态空间分配
  18. 用Nginx做端口转发(反向代理)
  19. 流浪地球动态桌面壁纸
  20. 如何提高沟通表达能力

热门文章

  1. 【无标题】Unknown column ‘userId‘ in ‘where clause‘ 解决方法
  2. Spark流式计算概念
  3. Springboot:整合redis对接口数据进行缓存
  4. 百度AI进行人脸识别
  5. 前端 cross-env 实现vue项目多环境打包
  6. HDL4SE:软件工程师学习Verilog语言(六)
  7. 2018伦敦全球电信大奖回顾,华为斩获5G先锋“全球大奖, 并携手中国移动香港荣获“云化先锋”奖!
  8. ESP8266-Arduino编程实例-ULN2003步进电机驱动
  9. Sketchup模型与ArcGIS进行数据交互的方法
  10. 人工智能研究中的几点思考