2021微软暑期机试题,进制转换
一 前言
前天参加了微软暑期实习的机试,可能对于经常做各种算法的同学这种题属于easy级别,因为没有出动态规划甚至二叉树这些我感觉有一定代码量的题(此处流下了一行小透明的眼泪= =!)全英文的体验考验了谷歌助手的英语阅读能力和我拧巴的理解能力,我会把平台放上来大家可以去刷一下
(Codility),可以添加自己的测试用例和有评分报告,总体感觉很友好,下次还来(呜呜~)
二 解题步骤
2.1 题目描述
因为忘记截图了,只能大概复述一下当时的题目。
2.1.1 简述前两题
第一题是给一个列表,比如[1,2,3,5,7],将列表上的数字依次放在圆上,求圆上相邻的两数之和为偶数的为一个偶数对,求圆上的最大偶数对。第二题是有N个塔吊,数组A表示塔吊作用范围,数组P表示塔吊所在的位置,问这N个塔吊能否把物体从B点移动到E点(这两道题我没有细说,如果有朋友感兴趣的话可以留言,我可以画图把题说清楚~)
2.1.2
这道题目是给定两个数组B,E,数组中只有0和1,表示的是-2进制的一个数字,比如B:[‘1’,‘1’,‘0’,‘1’,‘0’]就表示6(1*-2+1*-2*-2*-2+1*-2*-2*-2*-2=6),E:[‘1’,‘0’,‘0’]表示4,编写一个函数,当输入的B,E为以上值时,返回两数之和,即[‘1’,‘1’,‘1’,‘1’,‘0’](10)
2.2解题思路
当时没做出来,事后就觉得亏,进制转换的题属于基础,怎么变成负的就不会了呢。我们先梳理一下解题步骤:
- 先将给定的数组由负二进制转化成十进制
- 在十进制中将两数进行相加操作
- 再转成-2进制,转成数组的格式返回
2.3代码思路
前两步很好想,代码也不会有什么问题,这里就不给出代码了,主要描述一下10进制转化成-2进制。我们先来看一下如何转化,这里举例十进制的6和十进制的10如何转化成-2进制。(图片来源于马学长手稿~)
- 思路到这里就很明显啦,余数只能取1或者0,当商为2(-2)倍数时,余数为0,否则,余数为1.代码如下:
- python
def tooct(str10):
"""
十进制转换成-2进制
:return:
"""
res = []
flag = str10
print(flag)
while flag != 0:
if flag % 2 == 0:
res.append(0)
flag = int(flag / -2)
else:
res.append(1)
flag = int((flag - 1)/-2)
print(res)
res.reverse()
return res
三 问题和启发
3.1 遇到的一些问题
我试图在网络上找到进制转换的问题,但没有搜到关于负进制的问题,就想写一篇来说明一下。所以做了个小拓展,如果,我们将十进制转换成-3进制会有怎样的结果呢????
3.2 考虑-3如何转换
首先,我们梳理一下自己的思路,同样
- 取余结果0,1,2
- 商,再次取余
我们当然可以把三种取余结果都罗列出来,但如果是-4进制,-5进制呢,所以我们考虑能不能用一种通用的方式写出来。
10进制转换-3进制代码如下:
def trioct(str10):
"""
十进制转换成-3进制
:return:
"""
res = []
flag = str10
while flag != 0:
if flag == 1:
res.append(1)
break
if flag % -3 >= 0:
res.append(flag % -3)
flag = int(flag / -3)
else:
res.append(3 + flag % -3)
flag = int(flag / -3) + 1
res.reverse()
return res
- 我们发现一些很有意思的小问题,因为我用的python,而我的另一个小伙伴用的C++,然而我们分别在自己的编译器中运行对负数取余的操作却得到了不一样的结果,如下:
python
C++
- 查了一下资料,发现果真不同语言对负数取余操作所得到的值并不相同,(小伙伴说他还是喜欢c++,因为商*除数+余数=被除数,从这点来看,确实是c++更严谨啊~)
四 总结和致谢
熬夜写了这篇博客,希望大家可以怀着严谨认真的态度对待算法,祝愿大家在编程的道路上越走越远。每天一个脱发小技巧,感觉今天又轻了十几根头发的重量呢,好开心。
AT LAST,特别鸣谢MA学长的大力支持,提供了十分清晰的算法支持并且提供了c++环境下的实验结果
- 每日一句
一样是明月,一样是隔山灯火,满天的星,只有人不见,梦似的挂起。 -----------------------------林徽因《别丢掉》