腾讯音乐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))
#笔经##腾讯音乐娱乐#