今天笔试腾讯的技术岗位的数据分析,有个三元组问题
三元组定义:
能组成三角形的三元组,如(3,4,5),但(3,,5,4)又是一个不同的三元组,
输入要求:
输入3个数为,n,m,p,要求1<=n<100000,1<=m<100000,1<=p<100000,在输入的数以内,有多少个组合三元组,输出其个数,不满足输出为-1
例:
输入: 2 3 3 (中间空格隔开)
输出 :9
拿例子分析:n,m,p对应能取到的分别为 1,2\1,2\1,2,3,不同的组合方式有:
[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 1], [1, 2, 2], [1, 2, 3], [1, 3, 1], [1, 3, 2], [1, 3, 3], [2, 1, 1], [2, 1, 2], [2, 1, 3], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 3, 1], [2, 3, 2], [2, 3, 3] ,解决的问题即在这么多个组合中有哪些组合能组成三角形,并统计个数。
解决的问题:1 满足三角形的定义
2 计算出组合的情况
三角形的定义即两边之和大于第三边,对于任何一个3元素判断,既有:
def is_sanyuan(alist):
if alist[0] + alist[1] > alist[2] and alist[0] + alist[2] > alist[1] and alist[1] + alist[2] > alist[0]:
return True
else:
return False
组合来说,可以写三个循环来表示所有的情况。从n,m,p来看,满足的条件始终是 1<n,m,p<100000的,循环的起始为1,终止为n,m,p,tmp是所有堆积的元素,将其拆分为二维列表,用变量n表示
def get_all_example(res):
tmp = []
n = []
for i in range(1,res[0]+1):
for j in range(1,res[1]+1):
for k in range(1,res[2]+1):
tmp.append(i)
tmp.append(j)
tmp.append(k)
for l in range(0,len(tmp),3):
n.append(tmp[l:l+3])
return n
比较每个组合,判断是否为三元组并且计数,得到结果
count = 0
for i in example:
if is_sanyuan(i):
count += 1
所有python3代码
def is_sanyuan(alist):
if alist[0] + alist[1] > alist[2] and alist[0] + alist[2] > alist[1] and alist[1] + alist[2] > alist[0]:
return True
else:
return False
def get_all_example(res):
tmp = []
n = []
for i in range(1,res[0]+1):
for j in range(1,res[1]+1):
for k in range(1,res[2]+1):
tmp.append(i)
tmp.append(j)
tmp.append(k)
for l in range(0,len(tmp),3):
n.append(tmp[l:l+3])
return n
if __name__ == '__main__':
res = [int(i) for i in input().split(' ')]
example = get_all_example(res)
count = 0
for i in example:
if is_sanyuan(i):
count += 1
if count == 0:
print(-1)
print(count)
由于时间的问题,后来才做出来的,并没有测试如有问题或者错误请指正。