鱼C论坛

 找回密码
 立即注册
查看: 2690|回复: 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 编辑
  1. def reachNumber(target):
  2.     sum=0
  3.     i=1
  4.     a = abs(target)
  5.     while(sum<a or (sum-a)%2!=0):
  6.         sum+=i
  7.         i+=1
  8.    
  9.     return i-1
  10. print(reachNumber(3))
  11. print(reachNumber(1))
  12. print(reachNumber(2))
  13. print(reachNumber(-3))
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-31 17:29:27 | 显示全部楼层
二楼
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-31 17:29:47 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

刚好刷出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 17:35:48 | 显示全部楼层
我昨天的363题做出来了,我写在这里也给测一下吧
旧 363题
  1. def oldfun363(n,k):
  2.     if n == 1:
  3.         result = ''
  4.         for each in range(0,k):
  5.             result += str(each)
  6.         return result
  7.     result = '0'*(n-1)
  8.     hasBeenIn = set()
  9.     temp = 0
  10.     M = k**n
  11.     for each in range(0,M):
  12.         for inner in range(k-1,-1,-1):
  13.             tempInner = (temp*k+inner)%(M)
  14.             if tempInner not in hasBeenIn:
  15.                 hasBeenIn.add(tempInner)
  16.                 result += str(inner)
  17.                 temp = tempInner
  18.                 break
  19.     return result
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 17:53:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-3-31 18:03 编辑
  1. def reachNumber(target):
  2.     sum=0
  3.     i=1
  4.     a = abs(target)
  5.     while(sum<a or (sum-a)%2!=0):
  6.         sum+=i
  7.         i+=1
  8.    
  9.     return i-1
  10. print(reachNumber(3))
  11. print(reachNumber(1))
  12. print(reachNumber(2))
  13. print(reachNumber(-3))
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-31 17:54:37 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


刚刚写错了
i初始值应该是1,而不应该是0
因为输入0 的话就会出现负值,而且循环会多一次
试一下现在时间多长?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 18:17:30 | 显示全部楼层
此法不知道对不对,没严格验证
  1. import math
  2. def fun363(target):
  3.     def mySum(n):
  4.         return ((n+1)*n)//2
  5.     target = abs(target)
  6.     if target % 2 == 0:
  7.         start = math.floor((((2*target)**(1/2))-5)/4)
  8.         start = start if start >= 0 else 0
  9.         for each in range(start,start+100):
  10.             if mySum(4*each+3)>=target:
  11.                 return 4*each+3
  12.             if mySum(4*each+4)>=target:
  13.                 return 4*each+4
  14.     else:
  15.         start = math.floor((((2*target)**(1/2))-3)/4)
  16.         start = start if start >= 0 else 0
  17.         for each in range(start,start+100):
  18.             if mySum(4*each+1)>=target:
  19.                 return 4*each+1
  20.             if mySum(4*each+2)>=target:
  21.                 return 4*each+2
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯,112 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

44 ms
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

居然对了瞎编的,没有科学验证的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 18:45:09 From FishC Mobile | 显示全部楼层
有了一点思路,可能得暴力枚举
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 18:51:07 | 显示全部楼层
  1. def min_step(target):
  2.     count = 1
  3.     sum1 = 0
  4.     while sum1 < target:
  5.         sum1 = sum1 + count
  6.         count += 1
  7.     if sum1 == target:
  8.         print(count - 1)
  9.     else:
  10.         number1 = (target-sum1+count-1)*2 + count - 2
  11.         number2 = (sum1-target)*2 + count - 1
  12.         print(min([number1,number2]))
  13. min_step(3)
复制代码


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

评分

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

查看全部评分

小甲鱼最新课程 -> https://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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-31 21:26:02 | 显示全部楼层
本帖最后由 archlzy 于 2020-3-31 21:27 编辑
  1. def fun364(targert):
  2.     n = 0
  3.     sum_num = 0
  4.     target = abs(target)
  5.     while sum_num < targert:
  6.         n += 1
  7.         sum_num += n
  8.     if (sum_num - targert)%2:
  9.         return n+1
  10.     else:
  11.         return n
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

数列+一元二次方程
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 18:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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