鱼C论坛

 找回密码
 立即注册
查看: 4433|回复: 59

[已解决]Python:每日一题 366

[复制链接]
发表于 2020-4-1 18:57:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


在第一行我们写上一个 0。接下来的每一行,将前一行中的 0 替换为 01,1 替换为 10。

给定行数 n 和序号 k,返回第 n 行中第 k 个字符。(k 从 1 开始)

示例 1:

输入:n = 1, k = 1
输出:0
示例 2:

输入:n = 2, K = 1
输出:0
示例 3:

输入:n = 2, k = 2
输出:1
示例 4:

输入:n = 4, k = 5
输出:1
解释:
第一行:0
第二行:01
第三行:0110
第四行:01101001


欢迎大家一起答题!
最佳答案
2020-4-1 19:27:53
本帖最后由 kinkon 于 2020-4-20 18:27 编辑
def f366(n, k):return bin(k - 1).count('1') % 2

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-1 19:27:53 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 kinkon 于 2020-4-20 18:27 编辑
def f366(n, k):return bin(k - 1).count('1') % 2

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 19:30:48 | 显示全部楼层
def fun366(n,k):
    s='0'
    if k == 1:
        return '0'
    for i in range(n-1):        
        t = ""
        for l in s:
            add = '01' if l=='0' else '10'
            t+=add
        s = t[:]
    return t[k-1]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 19:46:51 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-4-1 20:29 编辑
def f366(n,k):
    def f(n):
        if n==1:
            return '0'
        elif n==2:
            return '01'
        else:
            return f(n-1)+f(n-1)[2**(n-3):]+f(n-1)[:2**(n-3)]
    return f(n)[k-1]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 20:01:33 | 显示全部楼层
本帖最后由 TJBEST 于 2020-4-1 21:55 编辑

我询问了一下,输出可以是字符串或者是数字。我这里采用字符串的形式。
想法非常简单,没用递归,但是思想雷同,我手算递归后发现等价的性质。
楼主 我这里默认您的检验序列没有错误 即输入的(n,k)一定输出‘0’或'1'不会存在其他情况
def fun366(n,k):
   #假设 输入数据不包含错误,即输入(n,k)输出'0'或者'1'无其他情况。得到n实际无效
    def inner(num):
        for each in range(0,num):
            if 2**each < num and 2**(each+1) >= num:
                return each + 1
    count = 0
    while k > 1:
        pow_2 = inner(k)
        k = k - 2**(pow_2-1)
        count += 1
    if count % 2 == 0:
        return '0'
    else:
        return '1'

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 20:09:23 | 显示全部楼层
本帖最后由 March2615 于 2020-4-1 21:39 编辑
def daily366_0(n: int, k: int) -> int:
    # 后一半和前一半1、0互换
    if k > 2 ** (n-1):  # 输入有误
        return -1
    if n == 1:
        return 0
    if k <= 2 ** (n-2):  # 目标在该行的前半段
        return daily366_0(n-1, k)
    else:  # 目标在该行后半段,与前半段是1、0互换的关系
        return daily366_0(n-1, k-2**(n-2)) ^ 1  # n行前半段和n-1行相同

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 20:22:21 | 显示全部楼层
def f(n,k):
    x = 0
    while n>1:
        if k > 2**(n-1):
            return False
        else:
            if k <= 2**(n-2):
                k = k
            else:
                k -= 2**(n-2)
                x += 1
            n -= 1
    if x%2 :
        return 1
    else:
        return 0

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 20:27:14 | 显示全部楼层
def f366(n,k):
    start="0"
    res=""
    while n-1:
        for i in range(len(start)):
            if start[i] == "0":
                res+="01"
            if  start[i] == "1":
                res += "10"
        start=res
        res=""
        n -= 1
    return start[k-1]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 21:40:21 | 显示全部楼层
@zltzlt 输出是字符还是数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-1 21:40:51 | 显示全部楼层
TJBEST 发表于 2020-4-1 21:40
@zltzlt 输出是字符还是数?

都可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 22:34:47 | 显示全部楼层
本帖最后由 塔利班 于 2020-4-1 22:39 编辑
def f366(n,k):
    f=1
    while k>2:
        t=2**(n-2)
        if k>t:
            k-=t
            f=1-f
        n-=1
    return 1-(k-1)^f

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 22:48:42 | 显示全部楼层
占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-1 22:49:54 | 显示全部楼层
本帖最后由 sunrise085 于 2020-4-1 22:54 编辑
def fun366(n,k):
    if 2**(n-1)<k or n<1 or k<1:
        return None
    code=[]
    k-=1
    if k==0:
        code.append(0)
    while k!=0:
        code.insert(0,k%2)
        k=k//2
    length=len(code)
    flag=True
    for i in code:
        if not i:
            flag=(not flag)
    if flag:
        r=length%2
    else:
        r=(length+1)%2
    return r
    
for i in range(1,33):
    print(fun366(8,i),end="")

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 00:27:15 | 显示全部楼层
def find_n_k(n, k):
    def get_n_k(x, y):
        if x == 1:
            get_num = -1
        elif y % 2 == 0:
            get_num = -get_n_k(x-1, y//2)
        else:
            get_num = get_n_k(x-1, (y+1)//2)
        return get_num
    return (get_n_k(n, k)+1)//2

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 02:11:47 | 显示全部楼层
本帖最后由 sYMMetrY 于 2020-4-2 04:37 编辑
方法一:
def q366(n,k):
    if k == 1 or k == 4:
        return 0
    if k == 2 or k == 3:
        return 1

    if k%2 == 0:
        if k%4 == 0:    
           return q366(n-2,(k//4))
        else:        
            return abs(q366(n-1,(k//2))-1)
        
    else:           
        if (k+1)%4 == 0:
           return abs(q366(n-2,((k+1)//4))-1)
          
        else:
           return q366(n-1,((k+1)//2))
方法二:直接构造数据的字符串
def q366(n,k):
    A = '01'
    a = '10'
    x = A
    i = 3
    while (3 <= i) and (i <= n):
        A = A+a
        a = a+x
        x = A
        i += 1

    return A[k-1]

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 02:38:02 | 显示全部楼层
k = str(bin(int(input('>>>'))))
if k.count('1') % 2 == 0:
    print(0)
else:
    print(1)
这题牛在答案跟n就没关系

思路是对k地板除2得到上一行的第k//2项,以余数来判断是否改变数值
统计递归到0的改变次数然后反推出所求项

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 10:05:46 | 显示全部楼层
n,k=map(int,input().split(","))
d="0"
if(n==1 and k==1):
     print("0")
else:
     while(pow(2,n-1)>len(d)):
          for i in d:
               if(i=="0"):
                    d = d.replace("0","01")
               if(i=="1"):
                    d = d.replace("1","10")     
print(d[k-1])

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 10:18:40 | 显示全部楼层
死骑Reynolds 发表于 2020-4-2 02:38
这题牛在答案跟n就没关系

思路是对k地板除2得到上一行的第k//2项,以余数来判断是否改变数值
k = int(input('请输入K的值:'))
count = 0

while k > 1:
    if k % 2 == 1:
        k += 1
        k //= 2
    else:
        k //= 2
        count += 1
if count % 2 == 1:
    print(1)
else:
    print(0)
有点小错误

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 10:50:22 | 显示全部楼层
def func(n,k):
    a = [0]
    while 1:
        b = a.copy()
        count = 1
        for i in range(len(a)):
            if a[i] == 0:
                b.insert(i+count,1)
            else:
                b.insert(i+count,0)
            count += 1
        if len(a) == 2**(n-1):
            print(a[k-1])
            break
        a = b.copy()
func(4,5)

easy

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 12:05:14 | 显示全部楼层
先占个楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 00:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表