阿里4.1笔试第一题

因为小弟也要参加笔试了,所以搜罗了一下最近的笔试题。
看到一题挺有意思的,也写个解法

问题:
题目:给一串二进制字符串如00011001,希望把他改为全为0,如果更改某个字符,那么他两边的字符也要更改,例如把第二位的0换成1,那么就变成了11111001.
如果无法变为全0,那么返回NO

想法:
找规律,最左边一位一定是1.这个关键,如果是1的话,那么左2位,就有2种选择,{翻,不翻}或者{不翻,翻},不妨假设为{翻,不翻}
循环每一位,由于该位是0还是1已知,左两位情况已知,那么后一位翻不翻就知道了。
这样循环到最后一位,按同样的方法,如果发现矛盾了,那么将前面所有位反号,就可以啦

另外,只有一种情况无解,即“10”。

input_str = "111111"
n = len(input_str)

op = [0 for i in range(n)]
# 假设为{翻,不翻}
op[0] = 0
op[1] = 1
for i in range(1, n):  # 1, ..., n-1
    # 循环,推导出下一步是啥
    if i != n-1:
        op[i+1] = (int(input_str[i])-(op[i]+op[i-1])) % 2
    # 最后一步单独判断
    if i == n-1:
        # 看是不是match
        if (int(input_str[i])-(op[i]+op[i-1])) % 2 == 0:
            break
        # 如果不match
        else:
            # 前n-1位反号
            for j in range(0, n-1):
                if op[j] == 0:
                    op[j] = 1
                elif op[j] == 1:
                    op[j] = 0
            # 填最后一位
            op[i] = (int(input_str[i])-op[i-1]) % 2
# 打完收工
print(op)



#阿里笔试##阿里巴巴##笔试题目#
全部评论
有一些没懂,请问可以解释一下“找规律,最左边一位一定是1.这个关键,如果是1的话,那么左2位,就有2种选择,{翻,不翻}或者{不翻,翻},不妨假设为{翻,不翻}”吗,有些不太理解为什么一定要1
点赞 回复
分享
发布于 2020-04-04 19:39

相关推荐

美团数据开发转正实习面经总结:美团效率,完全没准备好就面试了。问了很多八股,兼具深度广度,知道的不知道全问了。学习之路道阻且长啊。数仓分层:为什么不能直接建DWD,DIM层,ODS层的必要性是什么?DWS层的作用是什么,为什么不能直接建ADS层?完全同上乱答SQL考查:统计每个科目各等级的人数,写的很艰辛,面试的时候脑子经常短路,干着急。菜就多练分组topN,窗口函数。left join where中的条件写在where里和写在on里面有什么区别,查询结果一样吗?Java考查:HashMap底层组成,怎么减少扩容次数,答扩大初始容量,增加扩容因子。说说面向对象。了解的数据类型。Hive:什么情况会导致倾斜,怎么解决。写了一个HQL语句,问从提交到MR的整个详细执行过程,答的很粗略。hive 怎么根据表名去找表数据,metastore。MySQL 常见内存引擎,什么时候适合用哪种引擎。事务隔离级别。银行应该用哪种隔离级别。为什么用B+树,而不是B树或者其他。行列存储优缺点。常见的压缩格式。MR:切片规则,100个文件前面99个小文件,最后一个文件150M,默认切几片。顺势问到小文件的危害,怎么解决。分区器问题,疯狂拷打,但没什么印象了环形缓冲区调大调小有什么问题,纯乱答。写个快排,没注意有重复元素,好像陷入死循环了。问了为什么选择走数据开发这条路,有看过什么大数据类型的书吗。最后问你的亮点是什么,一直都不知道这些问题怎么答然后详细描述。其他的想不起来了。
点赞 评论 收藏
转发
点赞 评论 收藏
转发
2 2 评论
分享
牛客网
牛客企业服务