鱼C论坛

 找回密码
 立即注册
查看: 1974|回复: 42

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

[复制链接]
发表于 2020-3-31 17:29:18 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zltzlt 于 2020-3-31 17:45 编辑
这道题算昨天的


今天的题目:


假设你在一根无限长的数轴上站在 0 的位置,终点在 target 的位置。

每次你可以选择向左或向右移动。第 n 次移动(从 1 开始)可以走 n 步。返回到达终点需要的最小移动次数。

示例 1:

输入:target = 3
输出:2
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 3 。
示例 2:

输入:target = 2
输出:3
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 -1 。
第三次移动,从 -1 到 2 。


欢迎大家一起答题!
最佳答案
2020-3-31 17:53:50
本帖最后由 sunrise085 于 2020-3-31 18:03 编辑
def reachNumber(target):
    sum=0
    i=1
    a = abs(target)
    while(sum<a or (sum-a)%2!=0):
        sum+=i
        i+=1
    
    return i-1
print(reachNumber(3))
print(reachNumber(1))
print(reachNumber(2))
print(reachNumber(-3))

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-3-31 17:29:27 | 显示全部楼层
二楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-31 17:29:47 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 17:31:00 | 显示全部楼层

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

使用道具 举报

发表于 2020-3-31 17:35:48 | 显示全部楼层
我昨天的363题做出来了,我写在这里也给测一下吧
旧 363题
def oldfun363(n,k):
    if n == 1:
        result = ''
        for each in range(0,k):
            result += str(each)
        return result
    result = '0'*(n-1)
    hasBeenIn = set()
    temp = 0
    M = k**n
    for each in range(0,M):
        for inner in range(k-1,-1,-1):
            tempInner = (temp*k+inner)%(M)
            if tempInner not in hasBeenIn:
                hasBeenIn.add(tempInner)
                result += str(inner)
                temp = tempInner
                break
    return result

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-31 17:53:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-3-31 18:03 编辑
def reachNumber(target):
    sum=0
    i=1
    a = abs(target)
    while(sum<a or (sum-a)%2!=0):
        sum+=i
        i+=1
    
    return i-1
print(reachNumber(3))
print(reachNumber(1))
print(reachNumber(2))
print(reachNumber(-3))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3 没有评分机会了……

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-3-31 17:54:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 18:03:08 | 显示全部楼层


刚刚写错了
i初始值应该是1,而不应该是0
因为输入0 的话就会出现负值,而且循环会多一次
试一下现在时间多长?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 18:17:30 | 显示全部楼层
此法不知道对不对,没严格验证
import math
def fun363(target):
    def mySum(n):
        return ((n+1)*n)//2
    target = abs(target)
    if target % 2 == 0:
        start = math.floor((((2*target)**(1/2))-5)/4)
        start = start if start >= 0 else 0
        for each in range(start,start+100):
            if mySum(4*each+3)>=target:
                return 4*each+3
            if mySum(4*each+4)>=target:
                return 4*each+4
    else:
        start = math.floor((((2*target)**(1/2))-3)/4)
        start = start if start >= 0 else 0
        for each in range(start,start+100):
            if mySum(4*each+1)>=target:
                return 4*each+1
            if mySum(4*each+2)>=target:
                return 4*each+2

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-3-31 18:18:35 | 显示全部楼层
sunrise085 发表于 2020-3-31 18:03
刚刚写错了
i初始值应该是1,而不应该是0
因为输入0 的话就会出现负值,而且循环会多一次

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

使用道具 举报

 楼主| 发表于 2020-3-31 18:18:46 | 显示全部楼层
TJBEST 发表于 2020-3-31 18:17
此法不知道对不对,没严格验证

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

使用道具 举报

发表于 2020-3-31 18:20:42 | 显示全部楼层

居然对了瞎编的,没有科学验证的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 18:45:09 From FishC Mobile | 显示全部楼层
有了一点思路,可能得暴力枚举
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 18:51:07 | 显示全部楼层
def min_step(target):
    count = 1
    sum1 = 0
    while sum1 < target:
        sum1 = sum1 + count
        count += 1
    if sum1 == target:
        print(count - 1)
    else:
        number1 = (target-sum1+count-1)*2 + count - 2
        number2 = (sum1-target)*2 + count - 1
        print(min([number1,number2]))
min_step(3)

# 思路:先一直走到target之前或之后,(或直接到target),
# 然后分别反复移动到target(每移动一格需要前后走两步),
# 计算各自需要的步数并比较大小。

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-31 20:07:51 | 显示全部楼层
本帖最后由 Herry2020 于 2020-3-31 20:16 编辑

def fun364(target):
    sum = 0
    n = 1
    i = 1
    while True:
        sum += i
        if sum < target:
            i += 1
            n += 1
        elif sum > target:
            sum -= 2*i
            i += 1
            n += 1
        else:
            break
    return n

print(fun364(2))

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-31 20:37:03 | 显示全部楼层
def f364(target:int)->int:
    s,n,abs_t = 0,0,abs(target)
    while s<abs_t or (s-abs_t)%2 != 0:
        n+=1
        s+=n
    return n

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-31 21:04:51 | 显示全部楼层
这道题我能想到的办法有鱼油写出来了。另外TJBEST的是用了什么公式哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 21:05:34 | 显示全部楼层
我把下午写的修改了一下,while循环最多需要两次
import math
def reachNumber(target):
    a = abs(target)
    i=int(math.sqrt(a*2))
    sum1=i*(i+1)/2
    while(sum1<a or (sum1-a)%2!=0):
        i+=1
        sum1+=i
    return i
print(reachNumber(0))
print(reachNumber(1))
print(reachNumber(2))
print(reachNumber(-11))

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-31 21:26:02 | 显示全部楼层
本帖最后由 archlzy 于 2020-3-31 21:27 编辑
def fun364(targert):
    n = 0
    sum_num = 0
    target = abs(target)
    while sum_num < targert:
        n += 1
        sum_num += n
    if (sum_num - targert)%2:
        return n+1
    else:
        return n
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 22:06:13 | 显示全部楼层
fan1993423 发表于 2020-3-31 21:04
这道题我能想到的办法有鱼油写出来了。另外TJBEST的是用了什么公式哦

数列+一元二次方程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 11:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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