360校招之k进制数中最多(k-1)的数

360校招之k进制数中最多(k-1)的数

题目

链接:https://www.nowcoder.com/questionTerminal/a19f8670d25d444ab9e2f5601e1143ce?answerType=1&f=discussion
来源:牛客网

现在有q个询问,每次询问想问你在[l,r]区间内,k进制表示中,k-1的数量最多的数是哪个数。比如当k=2时,9的二进制就是1001,那么他就有2个1.

输入描述:
第一行一个q,表示有q组询问。

接下来q行,每行三个整数k,l,r,分别表示进制数,查询的数字,以及查询的范围。

满足1<=q<=100000,2<=k<=16,1<=l<=r<=10^16

输出描述:
对于每组询问,输出答案。如果有多个答案,请输出最小的。
示例1
输入
1
8 1 100
输出
63

思路

没有想到或者找到比较巧妙的思路,只有比较耗时耗力的做法,大神的代码主函数没看懂

技巧

1.将一个数字转化成k进制,使用“队列”

from collections import deque
def ToK(num,k):
    res = deque()
    while num:
        res.appendleft(num%k)
        num //= k
    return list(res)

2.将k进制转化成十进制

from collections import deque
def Tonum(res,k):
   ans = 0
   temp = 1
   for i in range(len(res)-1,-1,-1):
       ans += res[i] *temp
       temp *= k
   return ans

lic代码

from collections import deque
from math import pow
q = int(input())
def ToK(num,k):
    res = deque()
    while num:
        res.appendleft(num%k)
        num //= k
    return list(res)
def Tonum(res,k):
    ans = 0
    temp = 1
    for i in range(len(res)-1,-1,-1):
        ans += res[i] *temp
        temp *= k
    return ans
for i in range(q):
    k, l, r = tuple(map(int, input().split()))
    ans = l
    lk = ToK(l,k)
    cankao = 0
    for m in lk:
        if m == k-1:
            cankao+=1
    for j in range(l,r+1):
        jk,cankaoj = ToK(j,k),0
#        for m in jk:
#            if m == k-1:
#                cankaoj+=1
        cankaoj = jk.count((k-1))
#        if m == k-1:
#            cankaoj+=1
        if cankaoj>cankao:
            cankao = cankaoj
            ans = j
    print(ans)

您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为20.00%

大佬代码

链接:https://www.nowcoder.com/questionTerminal/a19f8670d25d444ab9e2f5601e1143ce
来源:牛客网

q = int(input())
from collections import deque
def ToK(num,k):
    res = deque()
    while num:
        res.appendleft(num%k)
        num //= k
    return list(res)
def Tonum(res,k):
    ans = 0
    temp = 1
    for i in range(len(res)-1,-1,-1):
        ans += res[i] *temp
        temp *= k
    return ans
for i in range(q):
    k, l, r = tuple(map(int, input().split()))
    record, tmp = 0, 0
    while tmp <= r:
        record = tmp
        tmp = tmp * k + (k - 1)
    if record >= l:
        print(record)
    else:
        low_k = ToK(l,k)
        for i in reversed(range(len(low_k))):
            if low_k[i] == k-1:
                continue
            else:
                change = low_k[i]
                low_k[i] = k-1
                if Tonum(low_k[:],k) > r:
                    low_k[i] = change
                    break
        print(Tonum(low_k[:],k))
您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为86.67%
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值