python算法题练习1
Description
实现一个函数exp:它接受一个正的小数参数 epsilon,按照如下算法计算 e^x 的近似值:
exp(x) ≈ 1 + x + x^2/2! + ... + x^i / i! + ... + x^n / n!
注意第i项的公式是a_i = x^i / i!,求和的范围是0 <= i <= n
计算
exp(x) ≈ a_0 + ... a_k其中|a_k| < epsilon且a_k是满足这个不等式的第一个项。
思考如何优化这个算法。
Input
第一行是小数epsilon,
第二行是需要计算的x。
Output
输出一个保留6位小数的结果。可以用 `"%.6f" % result` 来打印。
Sample Input 1
0.0001
1
Sample Output 1
2.718279
Sample Input 2
0.01
0
Sample Output 2
1.000000
算法总结:
Flag可以用于表示true false
Den可以用于表示阶乘
最开始的做法是定义了两个函数:一个exp,一个multiply用来算n!。其实这样算会造成很多冗余。可以用while 和设定变量,让数据进行迭代。
但是这道题还是显示错了,说是差一个case wa让我很迷。。。
def exp(epsilon,x):
result=1
t=1
flag=1
den=1
if x==0:
return "%.6f" % result
else:
while flag==1:
den=den*t
a=x**t/den
t=t+1
if abs(a)<epsilon:
flag=0
result=result+a
return "%.6f" % result
epsilon = float(input())
x = float(input())
print(exp(epsilon, x))
TwoSum (Python 3)
Description
给出一个整数数组arr 和一个目标和整数 a,返回一个 tuple `(i, j)`,其中 `arr[i] + arr[j] == a and i != j`。如果不存在这样的 i, j,返回 None。
数组中的每一项都满足在0 到 999 之间。
注意:
本题只支持Python 3,对其它语言不支持。
只需要实现函数two_sum 即可,不需要自己处理输入输出。
Input
整数数组参数arr 和整数 a
Output
一个tuple (i, j),或 None
Sample Input 1
[],1
Sample Output 1
None
Sample Input 2
[1], 1
Sample Output 2
None
Sample Input 3
[1,1,3], 4
Sample Output 3
(0, 2)
这道题我的思路是:因为在输入时会被输入[],以及数字都会在一开始转换成str型。因此存储进变量之后结果会变成”[balabalala]”,所以需要先将’[‘,’]’删除,再将剩余的字符转化为列表,再将列表内的str转化为int字符
这道题运用的知识有以下几个:
[if !supportLists]00001. [endif]
import re
string = u'127米'
print re.findall(r"\d+\.?\d*", string)
从字符串中提取数字
使用map方法
>>> list = [1.3, 2.3, 4, 5] #带有float型的列表 >>> int_list = map(int,list) #使用map转换>>> print int_list
[1, 2, 4, 5]
再使用了两个for循环,但是很迷惑的是这道题也不对orz
import re
arr=input("")
a=int(input())
arr=re.findall(r"\d+\.?\d*",arr)
arr=list(map(lambda x:int(x),arr))
b=len(arr)
def two_sum(a):
if b<=1:
return None
else:
flag=1
for x in range(0,b-1):
for i in range(x+1,b):
v=arr[x]+arr[i]
if v==a:
flag==0
result=(x,i)
return result
break
if flag==1:
return None
print(two_sum(a))