腾讯音乐916笔试第二题

字典序,越左的权重越大,所以应该找最左边的一个0序列,将其反转为1即可,后面的不需要动
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param num string字符串 
# @return string字符串
#
class Solution:
    def maxLexicographical(self , num ):
        rel = ''
        # 拼接字符串,用于返回结果
        label = 1
        for i in range(len(num)):
        # 遍历原始字符串的每一位
            if (num[i] == '1') and label :
            # 未遇到0,直接拼接
                rel += num[i]
            elif (num[i] == '0'):
                rel += '1'
                label = 0
            # 遇到0,拼接为1
            elif (num[i] == '1') and not(label):
            # 遇到0之后,再遇到1,拼接剩下的部分
                rel += num[i:len(num)]
                break
            # 拼接完毕后跳出循环
        return rel

method = Solution()
print(method.maxLexicographical('1001'))

下面说一下第一题,大概思路就是先建两个方法,一个是把10进制转换为k进制,然后是数一下这个k进制数字里面有几个‘1’
然后从1开始转换和计数,累加‘1’的数量,直到‘1’的数量满足条件

代码有误,只过了20%多,在找问题

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param n int整型 
# @param k int整型 
# @return long长整型
#
class Solution:
    def trans(self, m, k):
        # 把10进制的数字m转换为k进制
        sumL = []
        # 结果的列表
        while True:
            bit = m % k
            # 取余数
            if(m>1):
            # 如果余数不为0
                sumL.insert(0, bit)
            elif(m==1):
            # 除到最后一位
                sumL.insert(0, 1)
            else:
            # 为0则跳出
                break
            m = m // k
            # 更新m
        times = len(sumL) - 1
        sumS = 0
        # 逐位扩大倍数求和
        for sumI in sumL:
            sumS += sumI * (10 ** times)
            times -= 1
        return sumS
    def cacu(self, n):
        # 求数字n当中有多少个1
        count = 0
        times = 10
        while True:
            bit = n % times
            if(bit==1):
                count += 1
            elif(n==0):
                break
            n //= times
        return count
    def minM(self , n , k ):
        # write code here
        count = 0
        num10 = 1
        while True:
            numk = self.trans(num10,k)
            count += self.cacu(numk)
            if(count>=n):
                break
            else:
                num10 += 1
        return num10

method = Solution()
print(method.minM(5,3))
print(method.minM(10,10))

现在已经发现,第一题,当时进制转换部分的代码有问题,已更改

然后按照字符串的思路更改计数方法,先转成字符串,再计算‘1’出现的次数

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param n int整型 
# @param k int整型 
# @return long长整型
#
class Solution:
    def trans(self, m, k):
    # 利用字符串递归
        if m < k:
            return str(m)
        return self.trans(m // k,k) + str(m % k)
    def cacu(self, n):
        # 求数字n当中有多少个1
        count = 0
        numL = str(n)
        for num in numL:
            if num=='1':
                count += 1
        return count
    def minM(self , n , k ):
        # write code here
        count = 0
        num10 = 1
        while True:
            numk = int(self.trans(num10,k))
            count += self.cacu(numk)
            if(count>=n):
                break
            else:
                num10 += 1
        return num10

method = Solution()
print(method.minM(5,3))
print(method.minM(10,10))



第三题不会


#笔经##腾讯音乐娱乐#
全部评论
楼主二叉树右移的题写出来了没呀
点赞 回复 分享
发布于 2021-09-16 21:19
k进制这题模拟能过? 我A了一半
点赞 回复 分享
发布于 2021-09-16 21:24
把想做数据分析的人也当工程师用了,难过
点赞 回复 分享
发布于 2021-09-16 22:41

相关推荐

11-11 14:21
西京学院 C++
无敌混子大王:首先一点,不管学校层次怎么样,教育经历放在第一页靠上位置,第一页看不到教育经历,hr基本直接扔掉了
点赞 评论 收藏
分享
评论
1
4
分享
牛客网
牛客企业服务