当前位置: 首页 > news >正文

【微信事业群】趣味面试算法题

今天和大家分享博主在腾讯二面期间遇到的两道比较有意思的算法题,由Excel引出的两道面试算法题,可以点开上面的音乐,边听边看~。博主当时面的是微信事业群,截图如下:

二面主要是项目为主,其次就是算法。算法和项目大概各占了一半的时间,二面期间有两道比较有意思的算法题。这两道题面试官是以Excel为切入点引入的。到底是怎么一回事呢,先看下面的Excel截图:

上面是一个新建的Excel的截图,大家关注一下用红色方框标注的部分,我们把鼠标继续往右边继续拖动,依次可以得到下面两张图:

由上面可以看出:Excel中第一列用A表示:

A -> 第1列

B -> 第2列

C -> 第3列

...............

Z -> 第26列

AA -> 第27列

AB -> 第28列

基于上面这些事实,面试官引入了两道面试算法题。严格意义上讲,两道算法题都不难,但是其中一道有点绕,不太好处理,很容易出错。下面我们先从简单的那道题开始:

1

第一题比较容易,没有任何坑,题目如下:

在上面介绍的基础上,函数的输入是下图左边的列,期望的输出是下图右边的列:

举例而言,如果函数输入是:AB,那么算法就该输出当前输入在Excel中是第几列:28。

题目应该很清楚了,看到这的小伙伴可以停下来想想思路。问题不难,但是有些细节需要注意。在继续往下看前,一定要有自己的思考哦~

题目考察点很明确,属于:进制的转化问题。输入是Excel中用26个字母表示的列,输出的是对应列的十进制。所以呢,这道题本质是把26进制转换为10进制。但是,又有不一样的地方?

传统的26进制A对应的应该是十进制的0,;B应该对应的是十进制的1,到这里你可能发现了,它们之间存在一个1的差值。在进行进制转换时,注意处理这个差值就好。相对第二道题,这道比较好处理。第一道题唯一需要注意的地方就是那个差值的处理,代码如下:

解法一:

public int numberConvert(String s) {
    //存储最后转换的结果
    int res = 0;

    //进制转换的底数
    int base = 1;

    //charAt(0)是最高位!!!!!
    //这里我们从最低位开始处理
    for(int i=s.length()-1;i>=0;i--){
        //比正宗的26进制大一,处理差值1
        res += (s.charAt(i)-'A'+1)*base;
        base *= 26;//底数
    }
    return res;
}
复制代码

解法二:

public int numberConvert(String s) {
    int res = 0;
    int base = 1;

    //charAt(0)是最高位!!!!!
    //这里我们从高位开始处理
    for(int i=0;i<s.length();i++){
        res=res*26+(s.charAt(i)-'A'+1);
    }
    return res;
}
复制代码

两种解法本质是一样的,只是具体的实现细节不一样,关于本题的更多吐槽看法建议,欢迎小伙伴们评论留言~

2

微信事业群 面试官在第一道题之后,又给出了第二道相关的题。博主的二面面试一共有四道算法题。第一道就是上面那道,开胃算法一般比较简单,第二道相对第一道处理起来更绕一些 ,但也不难。题目如下:

也就是现在输入变成了:十进制的数字;输出的是Excel中字母表示的列。例如,输入28,算法需要输出第28列在Excel中是怎么表示的,即应该输出:AB。

这个问题其实有点绕,可能不是像看上去的那么好写代码,看到这的小伙伴可以停下来想想看,这个题的难点在哪,又该怎么处理呢?

就像上面提到的,这个题不是正宗的进制转换,正宗的26进制:A -> 0;B -> 1,而在本题中:   A -> 1;B - >2,本题的26进制与正宗的26进制相差了1。这个相差1提了很多遍,因为它是解题的关键。

本题的26进制比正宗的26进制相差1,所以在进行转换的时候,我们可以先把待转换的十进制数减一,减完之后再按照正常的26进制进行转换就可以了。实现代码如下:

public String convertToSequence(int num) {
    //处理上面说的:相差1问题
    //之后就是:正常的十进制转26进制啦
    num -= 1;
    if(num<0) return "";

    String res = new String();

    //先转换最低位,余数
    int remain = num % 26;
    res=(char)('A'+remain)+res;

    //最低位之外剩余要转换的数
    int cur = num / 26;

    if(cur>0 && cur<=26)//直接转换
        res=(char)('A'+(cur-1))+res;
    else if(cur>26){
        //剩余带转换的数>26则需要下次循环
        res = convertToSequence(cur)+res; 
           }
        
    return res;
}
复制代码

思路可能有点绕,大家可以停下来在草稿纸上试试看,转换的关键几个案例是:1 ->A;26-> Z; 27 -> AA;比如说,输入是27:

先转换最低位:(27-1)%26=0,所以最低位是‘A‘+0='A';其余位相当于是把十进制的(27-1)/26=1转换为本题中的26进制,剩余位为(1-1)/26=0,对应本题中的26进制为:‘A’+0='A',所以27转换之后为:AA。

非递归实现版本如下:

public String convertToTitle(int num) {
    String res = "";
    while(num != 0) {
        num -= 1;

        int remain = num % 26;
        res=(char)('A'+remain)+res;

        num = num / 26;
    }
    return res;
}
复制代码

题目有点绕,主要是处理:相差1的问题。

微信事业群的这两道面试算法题,你有什么看法呢?欢迎小伙伴们评论区留言分享疑问吐槽建议~

资料分享

java学习笔记、10T资料、100多个java项目分享


欢迎关注个人公众号【菜鸟名企梦】,公众号专注:互联网求职面经javapython爬虫大数据等技术分享**: 公众号**菜鸟名企梦后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务; 公众号菜鸟名企梦后台发送“资料”:即可领取5T精品学习资料**、java面试考点java面经总结,以及几十个java、大数据项目资料很全,你想找的几乎都有

推荐阅读

2108全网java面试题汇总(含答案)

2018全网java面试题汇总(下)  

转载于:https://juejin.im/post/5cbd75bee51d456e831f6931

相关文章:

  • Go 夜读 - 每周四晚上 Go 源码阅读技术分享
  • MAN命令
  • kettle-Excel输出
  • js知识点——2之navigator
  • WebMethod Description
  • 资源分享计划第三期 0511
  • thinkphp5---安装到宝塔出现Warning: require(): open_basedir错误
  • Linux 面试知识点笔记
  • 数据仓库方案
  • 魅族魅蓝x2简单开启usb调试模式的流程
  • javap 指令集
  • 扩展自easyui的combo组件的下拉多选控件
  • 实用 | 35个可以提高千倍效率的Java代码小技巧
  • 支持vim为python IDE
  • rewrite详解
  • 11111111
  • Android 控件背景颜色处理
  • Centos6.8 使用rpm安装mysql5.7
  • co.js - 让异步代码同步化
  • cookie和session
  • DOM的那些事
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • HomeBrew常规使用教程
  • If…else
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java精华积累:初学者都应该搞懂的问题
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • leetcode388. Longest Absolute File Path
  • Meteor的表单提交:Form
  • react 代码优化(一) ——事件处理
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 工作中总结前端开发流程--vue项目
  • 离散点最小(凸)包围边界查找
  • ​Spring Boot 分片上传文件
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • (¥1011)-(一千零一拾一元整)输出
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Ruby)Ubuntu12.04安装Rails环境
  • (分布式缓存)Redis持久化
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)计算机毕业设计ssm电影分享网站
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)EOS中账户、钱包和密钥的关系
  • (转)IOS中获取各种文件的目录路径的方法
  • .dwp和.webpart的区别
  • .NET delegate 委托 、 Event 事件,接口回调
  • .Net 访问电子邮箱-LumiSoft.Net,好用