python问题,跪求大神解答
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python问题,跪求大神解答相关的知识,希望对你有一定的参考价值。
书上的一个题,我知道答案,但是怎么用python写出来啊?求大神帮助
对乒乓球选手参加双打比赛,他们的球衣号码是1,2,…18.这时裁判惊喜地发现,每对选手的球衣号码之和都恰好是一个完全平方数,则求1号选手结对的是几号选手
#encoding=utf-8
import sys
def get_candidates(n):
''' 返回小于n的所有完全平方数 '''
ret = set()
i = 2
while (i*i <= n):
ret.add(i*i)
i += 1
return ret
_table = []
def bt(paired_numbers, player_numbers, candidates):
global _table
for s in _table:
if player_numbers == s:
return
_table.append(player_numbers)
if len(paired_numbers) == 9:
print "find solution"
print paired_numbers
sys.exit(0)
for p1 in player_numbers:
for p2 in player_numbers:
if p1 >= p2:
continue
if (p1+p2) in candidates:
new_player_numbers = player_numbers.copy()
new_paired_numbers = paired_numbers.copy()
new_player_numbers.remove(p1)
new_player_numbers.remove(p2)
new_paired_numbers.add((p1, p2))
bt(new_paired_numbers, new_player_numbers, candidates)
if __name__ == "__main__":
player_numbers = set()
for n in range(1,19):
player_numbers.add(n)
# 获取最大可能的号码和
candidates = get_candidates(18+17)
bt(set(), player_numbers, candidates)
代码都写出来了,不至于看不懂吧,最后结果为
set([(3, 13), (6, 10), (7, 18), (1, 15), (9, 16), (4, 12), (8, 17), (5, 11), (2, 14)])
也就是说,1的对手是15
追问大神,我可以问下这题的思路吗,我才学,有许多地方看不懂·········
追答这属于一到算法题目,和语言本身无关,相关资料去查阅回溯算法,也就是所说的backtracking,核心思路就是bt那个函数,它从候选人中选取两个出来,看这两个p1+p2是否为一个完全平方数,如果是,就将这两个候选人数据加入到paired_numbers中,然后递归剩下的players。相当于一种计算机的暴力算法,执行可能的所有步骤,最终总会找到答案。去看算法书吧,比我这里讲的详细多了。
参考技术A from random import shufflels = []#存储完全平方数
for i in range(10):
if i*i <=18+17 and i*i >= 1+2:#完全平方数取值范围
ls.append(i*i)
print '完全平方数: ' + str(ls)
players = []#存储选手号码
for i in range(1,19):
players.append(i)
print '参赛选手: ' + str(players)
def jiance(l):
c=0
shuffle(l)
for i in range(0,18,2):#九组组合
if l[i] + l[i+1] in ls:
c += 1
if c == 9:
print '可能的结果: ' + str(l)
if __name__ == '__main__':
while 1:
jiance(players)
基本思路就是总共有九组对手,我们假设一号位置和二号位置对打,三号位置和四号位置对打,以此类推,借用random函数,随机产生可能的排列组合情况,总有一组情况会满足题目要求,这种方法的弊端就是随机产生的排列效率低下。下面是一个结果,1号和15号对打。
完全平方数: [4, 9, 16, 25]参赛选手: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
可能的结果: [17, 8, 2, 14, 6, 10, 5, 11, 16, 9, 12, 4, 7, 18, 13, 3, 1, 15]本回答被提问者采纳
各位java大神,小弟跪求一个解决的方案:调用外部接口得到返回值--耗时问题
目前遇到的问题是这样的:我取出一个LIst集合,每一条数据构建成一个参数去调用一个外部接口,但是得到接口返回值需要耗时,比如10秒,要是List有上万条数据,那一次循环完得多少个小时了,求怎么解决啊 ,下面是我的伪代码:
For (int i =0;i<list.size();i++)
string returnstr = getResult();//调用外部接口得到返回值,这里可能耗时(比如10秒);
updateDate(returnstr).//根据返回值更新数据库的数据
这样下来得好长时间啊 ,用什么方式解决好呢,求给设计代码啊,小弟跪求,我的分数全给了,大神帮帮啊
用到的技术我也了解 ,关键是不知道怎么用,求代码啊 ,谢谢大侠了
java中可以这样
long start = Calendar.getInstance().getTime().getTime();
string returnstr = getResult();//调用外部接口得到返回值,这里可能耗时(比如10秒);
long end= Calendar.getInstance().getTime().getTime();
long time = end-start;//这里是毫秒数,根据自己需要转换一下吧
updateDate(returnstr).//根据返回值更新数据库的数据
先看看到底需要多长时间,话说是不是java实现的啊?追问
嗯,就是java实现,能给伪代码吗,谢了,用什么技术呢
追答先写一个处理线程
package org.zcm.run;
public class MyRequestThread implements Runnable
//构造函数,传入请求路径或者参数,只要满足你的请求条件就行
private String param;
public MyRequestThread(String p)
param = p;
public void run()
String returnstr = getResult(param);//调用外部接口得到返回值,这里可能耗时(比如10秒);
updateDate(returnstr);//根据返回值更新数据库的数据
public String getResult(String param)
//这里写请求的方法,用connect或者client都可以
//这里如果请求比较复杂,或者要求比较严谨的话,建议用httpclient
String req = new String();
return req;
//这个方法要怎么实现你懂的
private void updateDate(String returnstr)
// TODO Auto-generated method stub
大概就是这样了。
然后循环调用
为了线程安全,可以用一些线程池来管理。
public class ListOperate
public static void main(String[] args)
//建立线程池
ExecutorService pool = Executors.newSingleThreadExecutor();
//测试数据
List params = new ArrayList();
params.add("1");
params.add("2");
for(String p:params)
Thread reqThread = new Thread(new MyRequestThread(p));
pool.execute(reqThread);
pool.shutdown();
还有别的线程池,用法查查就有了
以上是关于python问题,跪求大神解答的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的这段python代码运行不出来结果,也没报错,跪求大神指点
通过html页面的表单提交中文数据,Java后台出现乱码。跪求大神解答。