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

今天和大家分享博主在腾讯二面期间遇到的两道比较有意思的算法题,由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的问题。

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


扫描下方二维码,及时获取更多互联网求职面经javapython爬虫大数据等技术,和海量资料分享:公众号后台回复“csdn”即可免费领取【csdn】和【百度文库】下载服务;公众号后台回复“资料”:即可领取5T精品学习资料java面试考点java面经总结,以及几十个java、大数据项目资料很全,你想找的几乎都有
扫码关注,及时获取更多精彩内容。(博主今日头条大数据工程师)

推荐阅读

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

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

微信小程序前端面试题包括以下几个方面的内容: 1. 关于wxml和标准的html的异同:wxml是微信小程序的组件标记语言,而html是网页的标记语言。它们的语法和标签有一些异同,但是主要的区别在于功能和用途上。wxml更加轻量级,专注于小程序的渲染和交互逻辑,而html更加强大,适用于网页开发的各种需求。 2. WXSS和CSS的异同:WXSS是微信小程序的样式语言,CSS是网页的样式表语言。它们的语法和属性有一些异同,但是主要的区别在于单位和选择器的限制上。WXSS使用rpx作为单位,可以根据屏幕宽度进行自适应,而CSS使用像素单位。另外,WXSS对选择器的支持较少,只支持基本的选择器,不支持复杂的选择器。 3. 微信小程序主要目录和文件的作用:微信小程序主要包括app.json、app.js、app.wxss、pages等目录和文件。app.json用来配置小程序的全局配置,app.js是小程序的全局逻辑文件,app.wxss是小程序的全局样式文件,pages目录用来存放小程序的页面文件。 4. 小程序的双向绑定和vue的异同:微信小程序使用setData方法来实现页面数据的双向绑定,而Vue使用v-model指令来实现数据的双向绑定。两者的实现原理和语法有一些异同,但是都可以实现数据的变化同步到页面上。 5. 微信小程序的相关文件类型:微信小程序的相关文件类型包括wxml、wxss、js、json、图片、音频、视频等。wxml文件是组件的模板文件,wxss文件是组件的样式文件,js文件是组件的逻辑文件,json文件是组件的配置文件,图片、音频、视频等文件是组件的资源文件。 6. 微信小程序的传值方法:微信小程序有多种传值方法,包括通过URL传参、通过setData方法传参、通过全局变量传参、通过Storage API传参等。 以上是微信小程序前端面试题的一部分内容,还有其他问可以根据需要进一步探讨。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【前端面试题——微信小程序】](https://blog.csdn.net/zz130428/article/details/129819232)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [2020微信小程序前端面试题汇总](https://blog.csdn.net/guopeisi/article/details/104890221)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值